《互联网大厂Java求职者面试:核心知识大考验》

16 阅读4分钟

面试官:请简要介绍一下 Java 中的多线程,以及它在实际业务场景中的应用。

王铁牛:多线程就是一个程序里同时运行多个线程呗。在实际业务中,比如电商系统里处理订单并发,就可以用多线程来提高效率。

面试官:那线程池呢?它有什么作用,如何合理配置线程池参数?

王铁牛:线程池就是预先创建一些线程,避免频繁创建和销毁线程。参数配置嘛,核心线程数得根据任务量来,最大线程数要考虑系统资源,队列大小也得合适。

面试官:好,这一轮表现不错。接下来问几个关于 JVM 的问题。Java 内存区域分为哪些,各自的作用是什么?

王铁牛:有堆、栈、方法区啥的。堆存对象,栈存局部变量,方法区存类信息。

面试官:那垃圾回收机制是怎样的,有哪些常见的垃圾回收算法?

王铁牛:垃圾回收就是回收没用的对象。算法嘛,有标记清除、标记整理、复制算法。

面试官:这一轮回答得也算可以。最后一轮,说说 HashMap 的底层实现原理,以及它在扩容时会发生什么?

王铁牛:HashMap 底层是数组加链表。扩容的时候,会重新计算位置,然后移动元素。

面试结束,面试官表示会让王铁牛回家等通知。

答案:

  1. 多线程:多线程是指在一个程序中可以同时运行多个线程,每个线程执行不同的任务。在电商系统中,多线程可以用于处理订单并发,比如多个用户同时下单,通过多线程可以同时处理这些订单请求,提高系统的处理效率。
  2. 线程池:线程池是预先创建一些线程,当有任务到来时,从线程池中获取线程来执行任务,避免了频繁创建和销毁线程的开销。合理配置线程池参数时,核心线程数应根据任务的平均数量来设置,如果任务量较大,核心线程数可以适当增加;最大线程数要考虑系统的资源限制,不能设置过大导致系统资源耗尽;队列大小要根据任务的处理速度和产生速度来确定,如果任务产生速度快,队列可以设置大一些,反之则小一些。
  3. JVM 内存区域
    • :用于存储对象实例,是垃圾回收的主要区域。
    • :存储局部变量、方法调用等信息。
    • 方法区:存储类信息、常量、静态变量等。
  4. 垃圾回收机制:垃圾回收就是回收不再使用的对象所占用的内存空间。常见的垃圾回收算法有:
    • 标记清除算法:先标记出所有需要回收的对象,然后统一回收这些对象所占用的空间。这种算法会产生内存碎片。
    • 标记整理算法:先标记出需要回收的对象,然后将存活的对象向一端移动,最后清理掉端边界以外的内存。
    • 复制算法:将内存空间分为两块,每次只使用其中一块,当这块内存空间满了,就将存活的对象复制到另一块空间,然后清理原来的空间。
  5. HashMap 底层实现原理:HashMap 底层是由数组和链表组成。当插入一个键值对时,首先通过 key 的哈希值计算出在数组中的位置,如果该位置为空,则直接插入新的节点;如果该位置不为空,则通过链表或红黑树(当链表长度大于 8 时会转换为红黑树)来存储新节点。在扩容时,会创建一个新的更大的数组,然后将原数组中的节点重新计算位置并插入到新数组中。具体来说,扩容时会重新计算每个节点的哈希值,根据新的数组大小计算出其在新数组中的位置,然后移动到新位置。