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

47 阅读3分钟

面试官:请简要介绍一下 Java 中的多线程。

王铁牛:多线程就是在一个程序中同时运行多个线程呗。

面试官:那线程池有什么作用呢?

王铁牛:能复用线程,提高效率。

面试官:好,这一轮表现不错。下一轮,说说 HashMap 的底层原理。

王铁牛:呃,就是有个数组,然后每个位置存个链表啥的。

面试官:那哈希冲突是怎么解决的?

王铁牛:嗯……好像是链表转红黑树啥的。

面试官:最后一轮,讲讲 Spring 的核心特性。

王铁牛:这个……就是能做依赖注入啥的吧。

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

答案

  1. 多线程:多线程是指在一个程序中同时运行多个线程,每个线程执行不同的任务。Java 中通过 Thread 类或者实现 Runnable 接口来创建线程。线程有不同的状态,如新建、就绪、运行、阻塞和死亡。多线程可以提高程序的并发性能,但也需要注意线程安全问题,比如共享资源的竞争。
  2. 线程池:线程池的作用主要有以下几点。一是复用线程,避免频繁创建和销毁线程带来的开销,提高系统性能。二是可以控制线程的数量,防止线程过多导致系统资源耗尽。线程池有多种类型,如固定大小线程池、缓存线程池等。使用线程池时,通过 ExecutorService 接口来管理线程,提交任务到线程池执行。
  3. HashMap 底层原理:HashMap 底层是基于数组和链表(JDK 1.8 后引入红黑树)实现的。它通过计算键的哈希值来确定在数组中的位置。当哈希值相同产生哈希冲突时,会在对应的数组位置形成链表或红黑树来存储多个键值对。HashMap 的初始容量默认是 16,负载因子是 0.75。当元素个数超过容量 * 负载因子时,会进行扩容操作,扩容后容量变为原来的 2 倍。
  4. 哈希冲突解决:在 JDK 1.8 之前,哈希冲突主要通过链表来解决,新插入的元素会添加到链表头部。当链表长度达到 8 时,会将链表转换为红黑树,以提高查询效率。红黑树是一种自平衡二叉查找树,它满足红黑树的性质,能够在 O(log n) 的时间复杂度内进行插入、删除和查找操作。
  5. Spring 核心特性:Spring 的核心特性包括依赖注入(DI),通过 XML 配置文件或者注解的方式将对象之间的依赖关系注入到对象中,使得对象之间的耦合度降低,提高代码的可维护性和可测试性。还有面向切面编程(AOP),可以在不修改原有代码的基础上,对业务逻辑进行增强,比如日志记录、事务管理等。另外,Spring 提供了 IoC 容器来管理对象的生命周期,方便对象的创建、销毁和管理。