Java入门部分

01.24

1. ==和equals比较的区别

==对基本数据类型来说是值比较,对引用数据类型来说比较的是内存地址(即两个引用类型的变量是否指向同一对象)
equals方法默认和==保持一致,只不过很多类对equals方法进行了重写,比如String、Integer这两个引用类型把它变成了值比较

2. &和&&的区别

&和&&都可以进行逻辑与运算,但&&是具有短路功能的逻辑与,当参与运算的第一个表达式运算结果为false时,整个表达式为false,不会再去计算第二个表达式的结果(&只有在前后两个表达式结果都为false时,才能判定整个表达式为false)

3. String、StringBuilder、StringBuffer三者的对比

关键词 含义 描述
String 不可变的字符串 在每次对字符串进行操作时都要开辟一块新的内存空间
StringBuilder 线程不安全的、可变的字符串 字符串的值可以动态修改,在多线程环境下可能带来错误的结果,性能略高
StringBuffer 线程安全的、可变的字符串 字符串的值可以动态修改,保证在多线程环境下的线程安全问题,性能略低

20230122155857

4. final、finally、finalize长得很像,对他们做一个区分

final是Java中的一个修饰符,可以修饰类、方法和变量(表示最终的、不可改变的)

  • 修饰类:该类不能够被继承,派生出新的子类(一个类不能同时使用abstract和final修饰)
  • 修饰方法:该方法不能够被重写或覆盖
  • 修饰变量:该变量必须在声明时赋初值,并且之后不能再次修改或指向其他对象。

final修饰的变量指向的对象本身不可变,但是还是可以调用对象的一些方法去修改对象中的属性值

finally是Java中的一种异常处理机制,finally代码块中的语句总会被执行(无论是否发生异常),常用来关闭数据库连接对象等

finalize是Java中一个与垃圾回收相关的方法,在垃圾回收器回收某个对象前会调用这个方法进行一些收尾操作

5. Java的基本数据类型有哪些?(四类八种)

  • 整型:byte、short、int、long
  • 浮点型:float、double
  • 字符型:char
  • 布尔型:boolean

String是一个引用类型的变量,不属于Java基本数据类型

6. Java中的集合、容器

图。。。

7. Collection和Collections有什么区别?

Collection是Java集合框架中的一个顶层接口,提供了一系列操作集合元素的通用方法,实现类可以直接使用

Collections是Java集合的一个工具类(不属于集合框架),提供了一系列静态方法,可以对集合中的元素进行排序、搜索、线程安全等操作

8. ArrayList和LinkedList的区别?

ArrayList的底层数据结构是数组,特点是支持随机访问,查询快
LinkedList的底层数据结构是双向循环链表,特点是不支持随机访问,增删快

9. 如何实现数组和List之间的转换?

20230122163130

10. HashMap的实现原理?

20230122164029

HashMap的底层数据结构是一个“数组+链表”,当我们向HashMap中put元素时,先根据元素的键利用hash函数计算出元素在数组中的位置,如果该位置已经有了其他元素(不同的key经过hash运算后得到的内存地址相同),该元素会被添加到链尾

在Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数超过八个之后,该链表会转为红黑树来提高查询效率

11. 方法重载和方法重写的区别

方法重载:在同一个类中,存在方法名称相同、参数类型不同或参数个数不同的多个方法。(在方法重载时,方法的访问修饰符和返回值类型不作设定)

方法重写:子类继承父类时,对父类中定义好的方法进行继承和改写。

  • 方法重写时,方法名称、参数列表、返回值类型必须和父类中的方法保持一致,方法的访问控制修饰符不能比父类开放性更低
  • 父类中的private私有方法、final方法和构造方法不能被子类所重写

12. hashCode()和equals()的联系?为什么重写equals()方法必须要同时重写对应的hashCode()方法

20230122191850

13. 接口和抽象类的对比

相同点

  • 本身都不能被实例化(它们通常都没有具体的实现)
  • 都不能用final进行修饰
  • 子类都需要实现接口或抽象类的方法声明

不同点

  • 接口中只能定义public static final修饰的常量
  • 抽象类中至少要有一个抽象方法,接口中的所有方法都隐式地添加了abstract关键字

01.27

1. 自动装箱和拆箱

装箱:将Java基本数据类型自动转换为Java包装器类型,如Integer a = 1;
拆箱:将Java包装器类型自动转换为Java基本数据类型,如int b = a;

2. Java的三大特性

封装:将对象的属性和方法封装到一个类中,并让方法公开,属性私有,从而在类的外部只能通过方法来访问属性,提高数据的安全性、易维护性

继承:子类继承父类非私有的属性和方法,提高代码的复用性。Java只支持单继承

多态:同一个行为在不同的对象上的表现不同。继承、方法重写、父类引用指向子类对象是多态的三要素

3. 序列化和反序列化
序列化:将Java对象转换为字节序列
反序列化:将字节序列恢复为Java对象的过程

为什么要将对象序列化(序列化的作用)?

  • Java对象不能直接存储在硬盘,将对象序列化后,就可以将字节序列持久化到硬盘中,需要时,再进行反序列化还原出Java对象
  • 序列化后的Java对象可以在网络上传输

在Java中通过对象流(ObjectInputStream,ObjectOutputStream)来实现对象的序列化和反序列化,并且被序列化和反序列化的对象需要实现Serializable接口

4. Java中的四种访问修饰符
private:修饰的变量只能在本类中使用

defalut:(默认)修饰的变量可以在同一包中使用

protected:修饰的变量可以在同一包中使用,也可以在其他包的子类中使用

public:修饰的变量可以在任意类中使用

5. throw和throws的区别

throws:在方法声明中使用,发生异常时抛出,由方法调用者处理异常

throw:在方法体内部使用,表示手动抛出一个异常,由方法体内部的语句处理

6. Java中错误和异常的区别
错误(Error):在程序运行时遇到的操作系统或硬件的故障,如内存溢出、不能读取磁盘分区、硬件驱动错误等。错误是致命的,这将导致程序无法运行,同时也是程序本身无法处理的

异常(Exception):在底层运行环境正常的情况下遇到的运行时错误。异常是非致命的,但也会导致程序的非正常终止,Java程序可以捕获和处理异常。

在Java中,Throwable是所有错误和异常的父类。异常分为编译时异常和运行时异常,Java规定必须在程序中处理可能发生的编译时异常

20230127113106

20230127114307

7. finally代码块一定会被执行吗

不一定

执行System.exit()方法退出虚拟机后,finally代码块将不会被执行

如果catch代码块中包含了return语句,finally中的代码将会在return前执行

8. 多线程一定比单线程快吗

不一定

当线程执行的任务是CPU密集型(没有或很少和IO设备交互)时,多线程不一定比单线程快,线程之间的切换也是需要耗费CPU资源的

当线程执行的任务需要和IO设备进行交互时(如写数据),由于CPU运算速度要比IO设备快的多,大多数时间CPU都是等待IO设备返回处理结果,在这段时间内CPU可以去执行其他线程,这种情况下多线程比单线程快的多

9. 反射的概念

反射:在程序运行时,对于任意一个类,只要给定类的名称,就能动态获得类的所有信息(包括属性和方法),进而可以调用其中的方法

10. 反射的优缺点

在运行期间可以根据业务功能动态执行方法、访问属性,非常灵活。
使用反射需要解析字节码,将内存中的对象进行解析,效率慢于直接执行Java代码。