在互联网大厂的面试现场,面试官严肃地坐在对面,看着眼前的求职者王铁牛。
第一轮: 面试官:首先,说说 Java 的核心知识有哪些? 王铁牛:嗯……有面向对象编程的三大特性,封装、继承、多态。 面试官:不错,那你再说说 Java 中的基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这些。 面试官:很好,那你知道这些基本数据类型在内存中的存储方式吗? 王铁牛:(沉默片刻)这个……不太清楚。
第二轮: 面试官:接着问你关于 JUC 的知识,说说线程池的作用是什么? 王铁牛:好像是用来管理线程的,提高线程的复用性。 面试官:那线程池有哪些参数呢? 王铁牛:(挠挠头)呃……这个好像有核心线程数、最大线程数之类的。 面试官:那你说说为什么要设置核心线程数和最大线程数呢? 王铁牛:(一脸茫然)不太明白,好像是根据业务需求来设置的吧。
第三轮: 面试官:再来说说 HashMap 的底层原理吧。 王铁牛:(思考了一下)好像是数组加链表的结构。 面试官:那在什么情况下会转化为红黑树呢? 王铁牛:(支支吾吾)这个……不太确定。 面试官:那你回去好好复习一下这些知识点吧,我们会在后续通知你结果。
答案:
- Java 的核心知识:面向对象编程的三大特性(封装、继承、多态)是 Java 语言的重要基础,封装可以隐藏对象的内部实现细节,提高代码的安全性和可维护性;继承允许子类继承父类的属性和方法,实现代码的复用;多态则使得同一个操作作用于不同的对象可以有不同的表现形式。基本数据类型在内存中的存储方式:基本数据类型在栈内存中存储,它们的值直接存储在栈内存中,速度快,但空间有限。而引用数据类型存储在堆内存中,栈内存中存储的是对象的引用地址,通过引用地址可以找到堆内存中的对象。
- 线程池的作用:线程池主要用于管理线程,提高线程的复用性,避免频繁创建和销毁线程带来的性能开销。通过线程池可以控制线程的数量,根据业务需求进行灵活的线程调度。线程池的参数包括核心线程数、最大线程数、队列容量等。核心线程数是线程池中的常驻线程数量,即使没有任务也会保持存活;最大线程数是线程池能够创建的最大线程数量;队列容量用于存放等待执行的任务。设置核心线程数和最大线程数是根据业务需求来决定的,比如如果业务中并发量较小,可以设置较小的核心线程数和最大线程数,以节省资源;如果并发量较大,则需要设置较大的线程数来处理任务。
- HashMap 的底层原理:HashMap 的底层是数组加链表的结构。数组用于存储键值对,每个数组元素称为一个桶(bucket)。当添加元素时,根据元素的哈希值计算出在数组中的索引位置,如果该位置已经有元素,则通过链表将新元素链接在后面。当链表长度超过一定阈值(默认 8)时,会将链表转化为红黑树,以提高查询效率。在查找元素时,同样根据哈希值计算出在数组中的索引位置,然后在对应的链表或红黑树中查找目标元素。