《互联网大厂 Java 求职者面试三轮提问及答案》
第一轮: 面试官:请你简单介绍一下 Java 的基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这几种。 面试官:不错,那你说说这些数据类型的默认值分别是多少? 王铁牛:byte 的默认值是 0,short 也是 0,int 为 0,long 是 0L,float 是 0.0f,double 是 0.0,char 是 '\u0000',boolean 是 false。 面试官:很好,那你再说说 Java 中的常量和变量的区别是什么? 王铁牛:常量的值在定义后不能改变,而变量的值可以在程序运行过程中改变。
第二轮: 面试官:谈谈你对多线程的理解吧。 王铁牛:多线程就是可以同时执行多个任务的机制,能提高程序的执行效率。 面试官:那你知道线程的状态有哪些吗? 王铁牛:有新建、就绪、运行、阻塞和死亡这几种状态。 面试官:那在多线程环境下,如何避免线程安全问题呢? 王铁牛:可以使用同步代码块或同步方法来解决,比如使用 synchronized 关键字。
第三轮: 面试官:说说你对 HashMap 的了解吧。 王铁牛:HashMap 是一种哈希表数据结构,用于存储键值对,它的查找、插入和删除操作效率很高。 面试官:那你知道 HashMap 的底层原理吗? 王铁牛:不太清楚。 面试官:HashMap 底层是通过数组和链表实现的,当链表长度超过阈值时会转为红黑树来提高查找效率。 面试官:那你说说 ArrayList 和 LinkedList 的区别吧? 王铁牛:不太清楚。 面试官:ArrayList 是基于数组实现的,查询快但插入和删除慢;LinkedList 是基于链表实现的,插入和删除快但查询慢。
面试官:今天的面试就到这里,你回去等通知吧。
答案:
- Java 的基本数据类型及默认值:
- byte:字节型,占 1 个字节,范围是 -128 到 127,默认值为 0。
- short:短整型,占 2 个字节,范围是 -32768 到 32767,默认值为 0。
- int:整型,占 4 个字节,范围是 -2147483648 到 2147483647,默认值为 0。
- long:长整型,占 8 个字节,范围是 -9223372036854775808 到 9223372036854775807,默认值为 0L。
- float:单精度浮点型,占 4 个字节,默认值为 0.0f。
- double:双精度浮点型,占 8 个字节,默认值为 0.0。
- char:字符型,占 2 个字节,默认值为 '\u0000'。
- boolean:布尔型,占 1 位,默认值为 false。
- 多线程相关:
- 新建状态:线程对象已经创建,但尚未启动。
- 就绪状态:线程对象创建后,调用 start()方法,进入就绪队列,等待 CPU 调度。
- 运行状态:线程获得 CPU 资源,开始执行 run()方法中的代码。
- 阻塞状态:线程在等待某个条件满足时,会进入阻塞状态,如等待锁、等待 I/O 操作等。
- 死亡状态:线程执行完毕或因异常等原因终止。
- 避免线程安全问题的方法:
- 同步代码块:使用 synchronized 关键字修饰代码块,同一时刻只有一个线程可以进入该代码块。
- 同步方法:使用 synchronized 关键字修饰方法,同一时刻只有一个线程可以进入该方法。
- HashMap 的底层原理:
- HashMap 内部维护了一个数组 table,用于存储键值对。
- 当向 HashMap 中插入键值对时,首先根据键的哈希值计算出数组的索引位置,然后将键值对存储在该索引位置的链表或红黑树中。
- 如果链表长度超过阈值(默认 8),则会将链表转为红黑树,以提高查找效率。
- ArrayList 和 LinkedList 的区别:
- ArrayList:基于数组实现,随机访问元素效率高,因为可以通过数组下标直接访问元素;但插入和删除元素效率低,因为需要移动数组元素。
- LinkedList:基于链表实现,插入和删除元素效率高,因为只需要修改链表的指针;但随机访问元素效率低,因为需要从头节点开始遍历链表。