DeepSeek 100道热门Java面试题及答案(2024版)
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面试的核心知识点,建议结合实际项目经验进行深入理解。面试时不仅要能回答问题,更要能展示解决问题的思路和实际应用能力。
更多推荐

所有评论(0)