100道热门Java面试题及答案(2024版)

一、Java基础(20题)

1. JDK、JRE、JVM的区别是什么?

答案:

· JDK:Java开发工具包,包含JRE和开发工具(javac, java, javadoc等)
· JRE:Java运行时环境,包含JVM和核心类库
· JVM:Java虚拟机,负责执行字节码文件

2. == 和 equals() 的区别?

答案:

· ==:比较基本类型的值或对象的引用地址
· equals():Object类中的方法,默认比较引用地址,但可被重写(如String类重写为比较内容)

3. 两个对象的 hashCode() 相同,equals() 也一定为 true 吗?

答案: 不一定。hashCode相同只能说明在哈希表同一个桶中,还需要通过equals()进一步判断。

4. final 关键字的作用?

答案:

· 修饰类:不可被继承
· 修饰方法:不可被重写
· 修饰变量:常量,初始化后不可修改

5. String、StringBuilder、StringBuffer的区别?

答案:

· String:不可变,线程安全
· StringBuilder:可变,非线程安全,性能高
· StringBuffer:可变,线程安全(synchronized修饰)

6. Java中的异常体系?

答案:

```
Throwable
    ├── Error(系统错误,如OutOfMemoryError)
    └── Exception
        ├── RuntimeException(运行时异常)
        └── 非RuntimeException(检查异常)
```

7. 抽象类和接口的区别?

答案:

对比项 抽象类 接口
方法 可以有具体方法 JDK8前全是抽象方法
变量 任意类型 只能是public static final
继承 单继承 多实现
构造器 可以有 不能有

8. List、Set、Map的区别?

答案:

· List:有序,可重复,通过索引访问
· Set:无序(LinkedHashSet有序),不可重复
· Map:键值对,键唯一

9. HashMap的工作原理?

答案:

· 数组+链表/红黑树结构
· 通过key的hashCode计算数组下标
· 哈希冲突时使用链表(超过8个转为红黑树)
· 负载因子0.75,扩容为2倍

10. ConcurrentHashMap的实现原理?

答案:

· JDK7:分段锁(Segment数组)
· JDK8:Node数组+CAS+synchronized

11. ArrayList和LinkedList的区别?

答案:

· ArrayList:基于数组,随机访问快(O(1)),增删慢
· LinkedList:基于双向链表,增删快(O(1)),随机访问慢(O(n))

12. 深拷贝和浅拷贝的区别?

答案:

· 浅拷贝:复制基本类型,引用类型复制引用
· 深拷贝:完全复制,包括引用指向的对象

13. 什么是Java序列化?如何实现?

答案:

· 将对象转换为字节流的过程
· 实现Serializable接口
· 使用transient关键字防止字段序列化

14. 反射是什么?有什么应用场景?

答案:

· 运行时获取类信息并操作类属性和方法
· 应用:Spring IOC、动态代理、JDBC等

15. 什么是泛型擦除?

答案:

· Java编译器将泛型信息转换为原生类型,字节码中不包含泛型信息
· 编译时类型检查,运行时无泛型

16. Java中的四种引用类型?

答案:

1. 强引用:Object obj = new Object()
2. 软引用:内存不足时回收
3. 弱引用:GC时立即回收
4. 虚引用:用于对象回收跟踪

17. BIO、NIO、AIO的区别?

答案:

· BIO:同步阻塞IO,一连接一线程
· NIO:同步非阻塞IO,选择器多路复用
· AIO:异步非阻塞IO,回调机制

18. Lambda表达式的优缺点?

答案:
优点:代码简洁,函数式编程
缺点:调试困难,性能略低

19. 什么是函数式接口?

答案:

· 只有一个抽象方法的接口
· 可使用@FunctionalInterface注解
· 如Runnable、Callable、Comparator

20. Optional类的作用?

答案:

· 解决空指针异常
· 提供链式调用:map(), filter(), orElse()等

二、Java并发编程(20题)

21. 进程和线程的区别?

答案:

· 进程:资源分配的最小单位,内存独立
· 线程:CPU调度的最小单位,共享进程内存

22. 创建线程的几种方式?

答案:

1. 继承Thread类
2. 实现Runnable接口
3. 实现Callable接口
4. 使用线程池

23. 线程的生命周期?

答案:
新建→ 就绪 → 运行 → 阻塞 → 死亡

24. sleep() 和 wait() 的区别?

答案:

· sleep:Thread类方法,不释放锁,时间到自动唤醒
· wait:Object类方法,释放锁,需要notify()唤醒

25. synchronized 和 ReentrantLock 的区别?

答案:

对比项 synchronized ReentrantLock
实现 JVM级别 JDK级别
锁类型 非公平锁 可选择公平/非公平
中断 不支持 支持lockInterruptibly()
条件 只能有一个条件 多个Condition

26. volatile关键字的作用?

答案:

1. 保证可见性:修改立即同步到主内存
2. 禁止指令重排序
3. 不保证原子性

27. 什么是CAS?ABA问题?

答案:

· CAS:比较并交换,乐观锁实现
· ABA问题:值从A→B→A,CAS认为没变化
· 解决方案:AtomicStampedReference带版本号

28. ThreadLocal的原理?

答案:

· 每个线程有自己的ThreadLocalMap
· key为ThreadLocal实例,value为存储的值
· 可能造成内存泄漏,需要remove()

29. 线程池的核心参数?

答案:

```java
ThreadPoolExecutor(
    int corePoolSize,      // 核心线程数
    int maximumPoolSize,   // 最大线程数
    long keepAliveTime,    // 空闲线程存活时间
    TimeUnit unit,         // 时间单位
    BlockingQueue<Runnable> workQueue, // 工作队列
    ThreadFactory threadFactory,       // 线程工厂
    RejectedExecutionHandler handler   // 拒绝策略
)
```

30. 线程池的拒绝策略?

答案:

1. AbortPolicy:默认,抛异常
2. CallerRunsPolicy:调用者执行
3. DiscardOldestPolicy:丢弃最老任务
4. DiscardPolicy:直接丢弃

31. 死锁产生的条件?

答案:

1. 互斥条件
2. 请求与保持
3. 不剥夺条件
4. 循环等待

32. 如何避免死锁?

答案:

1. 固定顺序获取锁
2. 设置超时时间(tryLock)
3. 银行家算法

33. AQS原理?

答案:

· AbstractQueuedSynchronizer抽象队列同步器
· 维护一个volatile int state和CLH双向队列
· 实现如ReentrantLock、CountDownLatch等

34. CountDownLatch 和 CyclicBarrier的区别?

答案:

· CountDownLatch:一次性的,等待多个线程完成
· CyclicBarrier:可重复使用,多个线程互相等待

35. Semaphore的作用?

答案:

· 控制同时访问特定资源的线程数量
· 可用于流量控制

36. ConcurrentHashMap的size()方法实现?

答案:

· JDK8:baseCount + CounterCell数组求和
· 避免CAS竞争,提高并发性能

37. Fork/Join框架?

答案:

· 用于并行计算,分治思想
· 工作窃取算法提高效率

38. CompletableFuture的使用场景?

答案:

· 异步编程
· 多个异步任务组合
· 异常处理

39. Happens-Before原则?

答案:

· 程序次序规则
· 管程锁定规则
· volatile变量规则
· 线程启动规则
· 线程终止规则
· 线程中断规则
· 对象终结规则
· 传递性

40. 如何排查死锁?

答案:

1. jstack查看线程堆栈
2. jconsole/jvisualvm监控
3. 查看日志和代码逻辑

三、JVM(15题)

41. JVM内存结构?

答案:

```
线程私有:程序计数器、Java虚拟机栈、本地方法栈
线程共享:堆、方法区(元空间)、直接内存
```

42. 垃圾回收算法?

答案:

1. 标记-清除:产生碎片
2. 复制算法:空间浪费
3. 标记-整理:无碎片
4. 分代收集:新生代(复制)、老年代(标记整理)

43. 垃圾回收器?

答案:

· 串行:Serial、Serial Old
· 并行:ParNew、Parallel Scavenge、Parallel Old
· 并发:CMS、G1、ZGC、Shenandoah

44. CMS垃圾回收器过程?

答案:

1. 初始标记(STW)
2. 并发标记
3. 重新标记(STW)
4. 并发清除

45. G1垃圾回收器特点?

答案:

· 分区算法,可预测停顿时间
· 标记-整理算法,避免碎片
· Region大小1-32MB

46. 判断对象是否存活的算法?

答案:

1. 引用计数法:循环引用问题
2. 可达性分析:GC Roots作为起点

47. GC Roots包括哪些?

答案:

· 虚拟机栈中引用的对象
· 方法区静态属性引用的对象
· 方法区常量引用的对象
· 本地方法栈JNI引用的对象

48. 类加载过程?

答案:
加载→ 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载

49. 双亲委派模型?

答案:

1. 应用程序类加载器 → 扩展类加载器 → 启动类加载器
2. 从父加载器开始尝试加载
3. 避免重复加载,保证安全

50. 什么情况下会触发Full GC?

答案:

1. System.gc()
2. 老年代空间不足
3. 方法区空间不足
4. Minor GC后进入老年代的对象大于老年代剩余空间

51. 对象创建过程?

答案:

1. 类加载检查
2. 分配内存(指针碰撞/空闲列表)
3. 初始化零值
4. 设置对象头
5. 执行init方法

52. 对象内存布局?

答案:
对象头(Mark Word+ 类型指针) + 实例数据 + 对齐填充

53. 什么是逃逸分析?

答案:
分析对象作用域,进行栈上分配、标量替换、锁消除优化

54. 四种引用类型的回收时机?

答案:

· 强引用:不回收
· 软引用:内存不足时回收
· 弱引用:GC时回收
· 虚引用:任何时候都可能回收

55. 如何排查OOM问题?

答案:

1. jmap -heap查看堆内存
2. jmap -dump生成dump文件
3. MAT/Eclipse Memory Analyzer分析
4. 查看GC日志

四、Spring框架(15题)

56. Spring IOC的理解?

答案:

· 控制反转,将对象创建交给容器管理
· 依赖注入,通过构造器、setter、注解注入

57. Spring AOP的实现原理?

答案:

· JDK动态代理:基于接口
· CGLIB动态代理:基于类,生成子类
· AspectJ:编译时织入

58. Bean的作用域?

答案:

1. singleton:单例(默认)
2. prototype:每次请求新实例
3. request:HTTP请求级别
4. session:Session级别
5. global-session:全局Session

59. Bean的生命周期?

答案:

1. 实例化
2. 属性赋值
3. 初始化(InitializingBean、init-method)
4. 使用
5. 销毁(DisposableBean、destroy-method)

60. Spring事务传播行为?

答案:

· REQUIRED(默认):有事务加入,无事务新建
· REQUIRES_NEW:新建事务,挂起当前
· NESTED:嵌套事务
· SUPPORTS:有事务加入,无事务非事务运行
· NOT_SUPPORTED:非事务运行
· NEVER:必须在非事务环境
· MANDATORY:必须在事务环境

61. Spring事务隔离级别?

答案:

· DEFAULT:使用数据库默认
· READ_UNCOMMITTED:读未提交
· READ_COMMITTED:读已提交
· REPEATABLE_READ:可重复读
· SERIALIZABLE:串行化

62. Spring MVC工作流程?

答案:

1. DispatcherServlet接收请求
2. HandlerMapping映射处理器
3. HandlerAdapter适配器调用
4. 执行Controller
5. 返回ModelAndView
6. ViewResolver解析视图
7. 渲染视图

63. @Autowired和@Resource的区别?

答案:

· @Autowired:Spring注解,按类型注入,配合@Qualifier指定名称
· @Resource:JSR-250标准,先按名称再按类型

64. Spring Boot自动配置原理?

答案:

· @SpringBootApplication → @EnableAutoConfiguration
· spring.factories中配置自动配置类
· @Conditional条件注解控制配置生效

65. Spring Boot Starter原理?

答案:

· 约定优于配置
· META-INF/spring.factories定义自动配置
· 依赖传递

66. Spring Cloud核心组件?

答案:

· Eureka:服务注册发现
· Ribbon:客户端负载均衡
· Feign:声明式HTTP客户端
· Hystrix:熔断器
· Zuul/Gateway:网关
· Config:配置中心

67. Spring Security核心流程?

答案:

1. 认证:AuthenticationManager
2. 授权:AccessDecisionManager
3. 过滤器链

68. Spring Boot Actuator作用?

答案:

· 监控应用状态
· 健康检查
· 指标收集
· 动态修改配置

69. Spring事件机制?

答案:

· ApplicationEvent:事件
· ApplicationListener:监听器
· ApplicationEventPublisher:发布者

70. Spring循环依赖解决方案?

答案:

· 三级缓存解决singleton循环依赖
· 构造器注入无法解决循环依赖

五、数据库(15题)

71. 数据库事务ACID特性?

答案:

· Atomicity:原子性
· Consistency:一致性
· Isolation:隔离性
· Durability:持久性

72. 事务隔离级别?

答案:

· 读未提交:脏读、不可重复读、幻读
· 读已提交:不可重复读、幻读
· 可重复读:幻读(InnoDB通过MVCC解决)
· 串行化:无并发问题

73. 索引的类型?

答案:

· B+Tree索引:最常用
· Hash索引:精确查找快,不支持范围
· 全文索引:文本搜索
· 聚簇索引:数据与索引一起存储
· 非聚簇索引:索引与数据分离

74. 索引失效的场景?

答案:

1. like以%开头
2. 对索引列进行运算或函数
3. 类型转换
4. OR条件部分没索引
5. 不符合最左前缀原则

75. MySQL优化方案?

答案:

1. 优化SQL语句
2. 添加合适索引
3. 分库分表
4. 读写分离
5. 使用缓存

76. 数据库锁的类型?

答案:

· 行锁:InnoDB支持
· 表锁:MyISAM
· 间隙锁:防止幻读
· 意向锁:表级锁

77. MVCC原理?

答案:

· 多版本并发控制
· 通过undo log和read view实现
· 提高并发读性能

78. 数据库三范式?

答案:

1. 每列都是不可分割的原子值
2. 非主键列完全依赖于主键
3. 非主键列之间不能有传递依赖

79. 分库分表方案?

答案:

· 垂直分库:按业务拆分
· 水平分表:按数据范围拆分
· 中间件:ShardingSphere、MyCat

80. 主从复制原理?

答案:

1. 主库binlog
2. 从库IO线程拉取
3. 中继日志
4. SQL线程重放

81. 慢SQL优化步骤?

答案:

1. EXPLAIN分析执行计划
2. 检查索引使用
3. 优化SQL语句
4. 考虑分库分表

82. Redis数据类型?

答案:

· String:字符串
· List:列表
· Hash:哈希表
· Set:集合
· ZSet:有序集合
· Bitmap:位图
· HyperLogLog:基数统计
· Stream:流

83. Redis持久化方式?

答案:

· RDB:快照,二进制文件
· AOF:日志追加,可配置同步策略
· 混合持久化:RDB+AOF

84. Redis缓存雪崩、穿透、击穿?

答案:

· 雪崩:大量key同时过期 → 随机过期时间
· 穿透:查询不存在数据 → 布隆过滤器
· 击穿:热点key过期 → 互斥锁

85. Redis集群方案?

答案:

· 主从复制
· Sentinel哨兵
· Cluster集群

六、分布式系统(15题)

86. CAP理论?

答案:

· Consistency:一致性
· Availability:可用性
· Partition Tolerance:分区容错性
· 只能三选二

87. BASE理论?

答案:

· Basically Available:基本可用
· Soft State:软状态
· Eventually Consistent:最终一致性

88. 分布式事务解决方案?

答案:

· 2PC:两阶段提交
· 3PC:三阶段提交
· TCC:Try-Confirm-Cancel
· 本地消息表
· Saga模式

89. 分布式锁实现方式?

答案:

· 数据库唯一索引
· Redis SETNX命令
· ZooKeeper临时有序节点
· etcd

90. 负载均衡算法?

答案:

· 轮询
· 加权轮询
· 随机
· 一致性哈希
· 最小连接数

91. 服务熔断和降级?

答案:

· 熔断:快速失败,防止雪崩
· 降级:返回默认值,保证核心功能

92. 消息队列作用?

答案:

1. 解耦
2. 异步
3. 削峰填谷

93. 如何保证消息可靠性?

答案:

· 生产者确认机制
· 消息持久化
· 消费者手动确认

94. 分布式ID生成方案?

答案:

· UUID
· 数据库自增
· Redis原子操作
· 雪花算法(Snowflake)
· 美团Leaf

95. 一致性哈希算法?

答案:

· 虚拟节点环
· 节点故障影响最小
· 均匀分布

96. 微服务拆分原则?

答案:

1. 单一职责
2. 高内聚低耦合
3. 按业务领域拆分
4. 演进式拆分

97. 服务网格Service Mesh?

答案:

· 处理服务间通信的基础设施层
· 如Istio、Linkerd

98. 配置中心的作用?

答案:

· 集中管理配置
· 动态刷新
· 版本管理
· 权限控制

99. 链路追踪原理?

答案:

· Trace:完整请求链路
· Span:每个调用单元
· 采样率控制

100. 容器化技术Docker?

答案:

· 镜像:只读模板
· 容器:运行实例
· 仓库:镜像存储
· 优势:环境一致性、快速部署、资源隔离

---

这份100题涵盖了Java面试的核心知识点,建议结合实际项目经验进行深入理解。面试时不仅要能回答问题,更要能展示解决问题的思路和实际应用能力。

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐