应聘 Java!看看 JavaSE 面试题?(中)

97 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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是增加原来的一倍。
ArrayListVector
推出时间JDK 1.2JDK 1.0
性能采用异步处理方式,性能更高采用同步处理方式,性能较低
安全性非线程安全线程安全
扩容规则默认增加50%默认增加一倍