以下是互联网大厂 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。 面试官:再说说自动装箱和拆箱是怎么回事? 王铁牛:自动装箱就是把基本数据类型自动转换成对应的包装类对象,比如 int 转换成 Integer;自动拆箱就是把包装类对象自动转换成对应的基本数据类型,比如 Integer 转换成 int。
第二轮: 面试官:谈谈你对多线程的理解,多线程有什么好处? 王铁牛:多线程可以让程序同时执行多个任务,提高程序的效率和响应性。比如在服务器端,同时处理多个客户端的请求。 面试官:那创建线程有哪些方式? 王铁牛:可以通过继承 Thread 类或者实现 Runnable 接口来创建线程,还可以使用线程池来管理线程。 面试官:说说线程池的优点吧。 王铁牛:线程池可以提高线程的复用性,减少创建和销毁线程的开销,还可以控制线程的数量,避免线程过多导致系统性能下降。
第三轮: 面试官:讲讲 HashMap 的底层原理吧。 王铁牛:HashMap 是基于哈希表实现的,它通过哈希函数将键映射到数组的索引位置,然后在相应的位置存储键值对。 面试官:那 HashMap 为什么会发生哈希冲突? 王铁牛:因为哈希函数可能会把不同的键映射到相同的索引位置,这就发生了哈希冲突。HashMap 采用链地址法来解决哈希冲突,即在发生冲突的位置链表存储多个键值对。 面试官:谈谈 HashMap 的扩容机制吧。 王铁牛:当 HashMap 中的元素数量超过负载因子(默认是 0.75)乘以数组长度时,就会进行扩容。扩容时会创建一个新的数组,长度是原来的 2 倍,然后将原来数组中的元素重新哈希到新数组中。
面试结束:今天的面试就到这里,你可以先回去等通知,我们会尽快给你回复。
答案总结:
- Java 的基本数据类型及其默认值:基本数据类型是编程语言中最基本的数据单元,每种类型都有固定的大小和取值范围。默认值在未显式初始化变量时被赋予,以确保变量在使用前有一个初始值。
- 多线程:多线程是让程序能够同时执行多个任务的机制,通过创建多个线程来并发执行不同的代码块,提高程序的并发性和响应性。创建线程的方式有继承 Thread 类或实现 Runnable 接口,线程池则用于管理线程的创建和销毁,提高效率。
- HashMap 的底层原理:HashMap 基于哈希表实现,通过哈希函数将键映射到数组索引,以快速访问和存储键值对。哈希冲突是由于不同键可能映射到相同索引位置而产生的,链地址法用于解决冲突,在冲突位置用链表存储多个键值对。扩容机制在元素数量超过负载因子乘以数组长度时触发,创建新的两倍大小的数组,并将原数组元素重新哈希到新数组中,以保持高效的插入和查找操作。