《互联网大厂 Java 求职者面试三轮提问及答案》

82 阅读4分钟

《互联网大厂 Java 求职者面试三轮提问及答案》

第一轮: 面试官:请你简述一下 Java 的基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这几种。 面试官:不错,那你说说这些数据类型的默认值分别是多少? 王铁牛:byte 是 0,short 是 0,int 是 0,long 是 0L,float 是 0.0f,double 是 0.0d,char 是 '\u0000',boolean 是 false。 面试官:回答得很准确,那你再说说 Java 中的面向对象特性有哪些? 王铁牛:有封装、继承、多态。

答案:

  • Java 的基本数据类型包括 byte(字节型)、short(短整型)、int(整型)、long(长整型)、float(单精度浮点型)、double(双精度浮点型)、char(字符型)、boolean(布尔型)。这些数据类型在不同的场景下有不同的使用方式,例如 byte 常用于表示较小的整数,int 是最常用的整数类型等。
  • 这些基本数据类型的默认值分别为:byte 的默认值是 0;short 的默认值是 0;int 的默认值是 0;long 的默认值是 0L(表示长整型的默认值);float 的默认值是 0.0f;double 的默认值是 0.0d;char 的默认值是 '\u0000',它表示一个空字符;boolean 的默认值是 false。
  • Java 中的面向对象特性封装是将数据和操作数据的方法封装在一个类中,对外隐藏内部实现细节,提高代码的安全性和可维护性。继承是子类继承父类的属性和方法,实现代码的复用和扩展。多态是指同一操作作用于不同的对象可以有不同的表现形式,通过方法重写和重载等方式实现。

第二轮: 面试官:请你谈谈 Java 中的多线程有什么作用? 王铁牛:可以同时执行多个任务,提高程序的效率。 面试官:那你说说 Java 中创建线程的方式有哪些? 王铁牛:有继承 Thread 类和实现 Runnable 接口这两种方式。 面试官:很好,那你再说说这两种方式的区别是什么? 王铁牛:(思考了一会)不太清楚。

答案:

  • Java 中的多线程可以让程序在同一时间内执行多个任务,比如在后台下载文件的同时还可以响应用户界面的操作,这样可以提高程序的效率和用户体验。
  • 创建线程的两种方式:
    • 继承 Thread 类:通过创建一个继承自 Thread 类的子类,并重写其中的 run() 方法来定义线程的执行逻辑。然后通过创建子类的对象并调用 start() 方法来启动线程。这种方式简单直观,但如果要创建多个线程,每个线程都需要继承 Thread 类,会导致代码的重复和不易维护。
    • 实现 Runnable 接口:定义一个实现了 Runnable 接口的类,并重写其中的 run() 方法。然后创建实现类的对象,并将其作为参数传递给 Thread 类的构造函数,创建 Thread 对象后调用 start() 方法启动线程。这种方式比继承 Thread 类更加灵活,因为多个线程可以共享同一个实现了 Runnable 接口的对象,避免了代码的重复。

第三轮: 面试官:请你说一下 Java 中的 HashMap 底层原理是什么? 王铁牛:(挠挠头)不太清楚。 面试官:那你说说 ArrayList 的扩容机制是怎样的? 王铁牛:(继续挠头)还是不太明白。 面试官:看来你对这些核心知识的掌握还不够扎实,回去好好复习一下吧,我们会在合适的时候通知你结果。

答案:

  • Java 中的 HashMap 底层是基于哈希表实现的。它通过哈希函数将键(key)映射到数组的索引上,从而实现快速的存储和检索操作。在存储元素时,HashMap 会根据键的哈希值计算出数组的索引位置,如果该位置已经有元素,则通过链表或红黑树来解决冲突。在检索元素时,同样根据键的哈希值找到数组的索引位置,然后在对应的链表或红黑树中查找目标元素。
  • ArrayList 的扩容机制是当 ArrayList 中的元素数量超过当前数组容量时,会创建一个新的更大容量的数组,并将原数组中的元素复制到新数组中。具体的扩容机制是将当前数组容量增加一半(例如,如果当前容量是 10,扩容后变为 15)。这样可以在一定程度上减少扩容的次数,提高效率。