本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. 为什么重写 equals 时必须重写 hashCode 方法?
-
默认的hashCode()方法会为具有相同内容的不同对象产生不同的哈希值,但我们认为具有相同内容的对象应为同一个对象,所以需要重写hashCode()方法
这是因为Object中的hashCode方法默认会为每个对象产生不同的哈希值(除了特殊情况,“重地”和“通话”),即对于两个具有相同内容的不同对象会产生两个不同的哈希值,但我们认为,相同内容的对象应为同一对象,所以需要重写hashCode来避免这种尴尬的情况。
2. final关键字的作用?
-
final修饰的变量为常量,只能赋值一次,不能重新赋值,对于基本数据类型来说表示值不能改变,对于引用数据类型来说表示所引用的地址值不能改变
-
final修饰的方法为最终方法,不能被子类重写
为什么要使用final修饰方法?
原因一: 将方法锁定,防止子类修改它的含义
原因二: 提高效率。在早期Java实现版本中,会将final方法转为内嵌调用,但如果方法过于庞大则性能提升可能不是很明显,不过现在已经不需要通过这些方式进行优化了,类中所有private修饰的方法都被隐式地指定为final方法。
-
final修饰的类为最终类,不能被继承(最终类中的方法都会被隐式地指定为final方法)
3. &和&&的区别?
-
相同点
- &和&&都可以用作逻辑与运算符,只有符号两边的表达式都为true时,结果才为true,否则,只要有一方为false,结果就为false
-
不同点
- &可以用作位运算符。当&操作符两边不是boolean类型时,&表示按位与操作,通常使用0x0f与一个整数进行与运算,来获取该整数的低四位。例如,0x31 & 0x0f --> 0x01
- &&也称短路与,具有短路功能,即当符号左边表达式为false时,不对右边表达式进行运算。
4. ArrayList 与 LinkedList 区别?
-
相同点
- 都是List接口的实现类
- 都是非线程安全的
- 都能够存储重复元素,并且有序
-
不同点
- 底层数据结构不同: ArrayList底层是Object数组,而LinkedList底层是双向链表
- 快速随机访问不同:ArrayList支持高效地随机访问元素,即能够通过索引获取元素,对应于get(int index)方法;而LinkedList不支持
- 内存空间占用不同: ArrayList的空间占用主要在于列表尾部会预留一定容量的空间;而LinkedList的空间占用主要在于列表的每一个元素消耗的空间比ArrayList多(因为需要存放前驱和后继)
5. List,Set,Map三者的区别?
-
相同点
- 都是用于存储数据的容器接口
-
不同点
- List接口存储的元素-->有序可重复(多个元素引用相同的对象)
- Set接口存储的元素-->无序不可重复(不会有多个元素引用相同的对象)
- Map接口存储的元素-->键值对,键不可重复,值可重复(多个key可以引用相同的对象)
6. Java序列化中,如果有些字段不想进行序列化,应怎么做?
- 可以使用
transient关键字修饰这些字段。
transient关键字的作用:阻止成员变量被序列化,被transient修饰的成员变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。
7. 获取键盘输入常用的两种方法
-
方法一:Scanner对象→nextLine()
Scanner sc = new Scanner(System.in); String str = sc.nextLine(); sc.close(); -
方法二:BufferedReader对象→readLine()
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); br.close();
8. 既然有了字节流,为什么还需要字符流?
- 因为字节流在处理数据时是逐个字节处理的,这个过程是比较耗时的。对于处理一些文本文件,如果我们不知道编码类型就很容易出现乱码问题。
- 所以,I/O流就提供了一个直接操作字符的接口,方便了对字符进行流操作。
如果传输的是音频、图片等媒体文件,则只能使用字节流;如果传输的是纯文本文件,则最好使用字符流。
9. final、finally、finalize的区别
- final修饰的变量为常量,对于基本数据类型,表示值不可变,对于引用数据类型,表示所引用的地址值不能改变;修饰的方法为最终方法,不能被重写;修饰的类为最终类,不能被继承。
- finally是异常处理语句结构的一部分,无论是否发生异常,finally内的代码都会被执行。
- finalize 是 Object 类中的一个方法,当垃圾回收器执行的时候会调用被回收对象的此方法,完成一些内存清理工作。(jdk 1.9过期)
10. ArrayList和Vector的区别
-
相同点:
- 都实现了List接口
- 都是有序集合,即记录元素的存储顺序
-
不同点:
- 同步性:ArrayList 是非线程安全的,即方法之间是线程不同步的;Vector 是线程安全的,即方法之间是线程同步的。所以,在单线程中建议使用ArrayList,提高效率;与此相反的,在多线程中建议使用Vector
- 容量增长:ArrayList和Vector都有一个初始的容量,当容量不足时就需要进行扩容,扩容并不是简单地增加一个存储单元,而是增加多个存储单元。为了取得内存空间利用和程序效率的平衡,它们的扩容规则是不相同的。ArrayList是增加原来的0.5倍,而Vector是增加原来的一倍。
| ArrayList | Vector | |
|---|---|---|
| 推出时间 | JDK 1.2 | JDK 1.0 |
| 性能 | 采用异步处理方式,性能更高 | 采用同步处理方式,性能较低 |
| 安全性 | 非线程安全 | 线程安全 |
| 扩容规则 | 默认增加50% | 默认增加一倍 |