网站首页 > 技术文章 正文
准备在 2025 年担任高级 Java 开发人员吗?这份包含100 多个面试问题及答案的综合清单涵盖了以下实际场景:
Spring 微服务集成
核心 Java(线程、集合、内存)
设计模式
算法与数据结构
SQL 和数据库设计
1. 核心 Java(25 个问题)
多线程和并发
synchronized1.和之间的区别ReentrantLock?
synchronized是一个关键字,提供具有自动释放功能的内在锁定。ReentrantLock提供更多控制(例如,tryLock,公平锁定)并且必须手动解锁。
2. 什么是死锁?如何预防?
当两个线程互相等待对方释放锁时,就会发生死锁。可以使用锁排序、超时机制或 tryLock 来预防死锁。
3. 的作用是什么volatile?
确保跨线程变量更改的可见性。防止变量在本地缓存。
4. 它是如何ThreadLocal工作的?
它内部使用线程本地映射为每个线程维护一个单独的值。
5. 什么时候应该使用Callableover Runnable?当你需要返回值或者想要抛出已检查异常时
使用。Callable
收藏
6.HashMap内部是如何实现的?
使用一个 bucket 数组 (Node[]),每个条目通过哈希算法存储。在 Java 8+ 版本中,使用链式或平衡树来处理冲突。
ArrayList7.和之间有什么区别LinkedList?
ArrayList使用动态数组(快速随机访问)。LinkedList使用节点(高效插入/删除)。
8. 何时使用ConcurrentHashMapvs
Collections.synchronizedMap()?
ConcurrentHashMap通过基于段的锁定提供更好的并发性。synchronizedMap锁定整个地图。
9. 快速失败迭代器和故障安全迭代器有什么区别?
快速失败迭代器会抛出
ConcurrentModificationException。故障安全迭代器(例如CopyOnWriteArrayList)使用快照。
10.TreeMap和有何HashMap不同?
TreeMap是排序的,并使用红黑树。HashMap是无序的,并使用散列。
OOP 和最佳实践
11. Java 中 OOP 的四大支柱是什么?
封装、抽象、继承、多态。
12. 组合和继承的区别?
组合使用“has-a”关系,而继承使用“is-a”关系。
13. 什么是里氏替换原则?
子类型必须能够替换其基类型,且不影响其正确性。
14. 接口可以有静态方法吗?
是的,从 Java 8 开始。
15. 什么是钻石问题?Java 8 如何处理它?
它发生在方法的多重继承中。Java 使用显式覆盖来解决它。
内存管理
16. Java 中的垃圾回收是什么?垃圾回收
是指从不可达对象中自动回收内存的过程。
17. 解释 Java 内存模型。
堆(年轻代、老年代)、栈、元空间。JMM 控制线程安全的读写操作。
18. PermGen 和 Metaspace 有什么区别?
PermGen(Java 8 之前)的大小是固定的。而 Metaspace 的大小是动态增长的。
19. G1GC 与 CMS 有何不同?
G1GC 是基于区域的、并行的,并且具有可预测的暂停时间。
20. 如何检测并修复内存泄漏?
使用 VisualVM、JProfiler 等工具。常见原因:静态集合、监听器未移除。
Java 8+ 功能
21. 什么是函数式接口?
一个只有一个抽象方法的接口。支持 lambda 表达式。
22. Streams 中的map()和flatMap()
map()有什么区别?转换每个元素。flatMap()展平嵌套结构。
23. 什么是方法引用?
它是使用语法调用方法的简写形式::。例如,System.out::println。
24. 什么是 Optional ?如何使用?
为了避免null。请使用isPresent()、orElse()、map()。不要误用 Optional 作为容器。
25. 接口中默认方法的目的是什么?
允许在不破坏实现的情况下添加方法。
2. Spring Boot 和微服务(25 个问题)
Spring Boot 内部
26. Spring Boot 自动配置如何工作?
通过 类@EnableAutoConfiguration路径检测和基于条件的 bean 来实现。
@Component27. 、、之间的区别@Service?@Repository
都是刻板印象。@Repository添加了 DB 异常翻译。添加了@Service业务语义。
28. Spring 如何管理 Bean 的生命周期?
使用作用域、后处理器@PostConstruct、@PreDestroy生命周期接口。
29. 的作用是什么@ConditionalOnProperty?
根据属性值有条件地启用 bean。
30. 如何处理循环依赖?
避免使用构造函数注入。将@Lazysetter 注入作为最后的手段。
微服务集成
31. 如何实现服务间通信?
REST(RestTemplate/WebClient)、gRPC、Kafka。声明式 REST 更倾向于使用 Feign。
32. 同步和异步调用之间有什么区别?
同步等待响应;异步使用回调或消息传递(Kafka/RabbitMQ)。
33. 如何实现重试、回退和断路器?
使用 Resilience4j 或 Spring Cloud Circuit Breaker 的回退方法。
34. 如何确保服务之间的向后兼容性?
版本化端点(/v1/api)、契约测试(Pact)、模式演化工具。
35. API 网关在微服务架构中的作用是什么?
路由请求、应用身份验证、速率限制、转换有效负载。
安全性和弹性
36. 如何保护 REST 端点?
使用 Spring Security 的 JWT,以及基于用户的访问的 OAuth2。
37. OAuth2 和 JWT 有什么区别?
OAuth2 是一种协议。JWT 是一种令牌格式。OAuth2 可以使用 JWT 作为令牌。
38. 如何在 Spring Security 中实现 RBAC?
使用注解或配置 DSL 将角色映射到端点。
39.如何保护微服务免受 DDOS 攻击或滥用?
速率限制、断路器、Web 应用防火墙 (WAF)。
40. 什么是速率限制?如何实现?
限制请求量。可以使用 Bucket4j、基于 Redis 的计数器、API 网关过滤器。
配置和可观察性
41. 什么是 Spring Cloud Config Server?
它使用 Git/FS/DB 后端进行集中配置。可通过 刷新/actuator/refresh。
42.如何实现分布式追踪?
使用 Spring Sleuth 和 Zipkin/Jaeger。
43. 执行器如何在生产环境中发挥作用?
暴露健康状态、指标、Bean 和映射。使用/actuator/*端点。
44. 如何实时监控微服务?
Prometheus + Grafana,Micrometer metrics。
45. 您使用什么工具来记录日志和指标?
ELK 技术栈(Elastic、Logstash、Kibana)、Prometheus、OpenTelemetry。
部署与失败
46.如何实现零停机部署?
蓝绿部署、滚动更新、Kubernetes 就绪探测。
47.什么是蓝绿部署?
部署到非活跃环境,验证后切换流量。
48. 如果服务崩溃了会发生什么?该如何恢复?
重试、断路、自动扩缩、使用 Kubernetes 活性探测。
49. 如何处理分布式事务中的数据一致性?
Sagas(编排/编排)、最终一致性、发件箱模式。
50.什么是Saga模式?什么时候应该使用它?
通过补偿步骤管理长时间运行的分布式事务。
3. 设计模式(20 个问题)
51. 什么是单例模式?如何在 Java 中实现它?
确保只存在一个实例。通过私有构造函数和静态方法实现。
52. 工厂模式与抽象工厂模式有何不同?
工厂模式返回一种产品。抽象工厂模式返回相关的产品系列。
53. 什么是策略模式?
它封装了可互换的算法。提倡组合而非继承。
54. 建造者模式通常用在哪些地方?
用于对象构造(例如StringBuilder,Lombok @Builder)。
55.什么是观察者模式?
允许订阅者对状态变化做出反应(例如,事件监听器)。
56. 结合实际应用解释代理模式。
代理控制访问(例如,AOP、Hibernate中的延迟加载)。
57. 适配器模式和装饰器模式的区别?
适配器改变接口。装饰器增加职责。
58. 什么是模板方法模式?
在超类中定义算法的框架,让子类覆盖其步骤。
59.什么时候使用命令模式?
用于将请求封装为对象(例如撤销/重做系统)。
60. 责任链模式有什么好处?
解耦发送者和接收者。多个处理器可以处理请求。
61. 什么是依赖注入?Spring 如何使用它?这是
一种注入依赖项而非硬编码的技术。Spring 使用构造函数/setter/字段。
62. Spring 中 MVC 是如何实现的?
控制器映射请求,服务处理逻辑,模型是数据对象,视图渲染 UI。
63. 什么是 AOP?常见用例?
面向切面编程,用于处理日志记录、事务等横切关注点。
64. 延迟初始化在模式中有何用处?
延迟对象创建。在单例模式和代理模式中很有用。
65. 组合和聚合有什么区别?
组合:拥有生命周期。聚合:只是一个引用。
66. 模式会带来复杂性吗?如何平衡?
是的。只在有持续效益的地方应用模式。避免过度设计。
67. Mediator模式的作用是什么?
集中对象之间的通信,以降低耦合度。
Integer.valueOf()68. Java API 中的享元模式示例?String.intern()重用对象以节省内存。
69. Java 的枚举单例模式使用什么?
枚举是实现单例模式最安全的方式,可以防止反射和序列化。
70. 如何测试使用了工厂模式或策略模式的代码?
使用依赖注入或模拟框架来注入模拟策略/工厂。
4. 算法与数据结构(15 个问题)
71. 如何在不使用额外空间的情况下反转 LinkedList?
迭代地更改next指针。跟踪前一个/当前节点。
72. 编写一个函数检查一个字符串是否为回文。
可以使用双指针技术,或者反转比较。
73. HashMap 操作的时间复杂度是多少?
平均情况是 O(1)。最坏情况由于碰撞导致时间为 O(n)。
74. 解释二分查找算法。
排序数组上高效的 O(log n) 算法。分而治之。
75. 快速排序是如何工作的?
围绕一个枢轴进行划分。递归地对分区进行排序。平均复杂度为 O(n log n)。
76. BFS 和 DFS 有什么区别?
BFS 使用队列(层序)。DFS 使用堆栈/递归(深度优先)。
77. Java 中什么时候用堆?
优先级队列、堆排序。用于 Top-K 问题。
78. 实现 LRU 缓存。
使用 LinkedHashMap 或者 HashMap + 双向链表的组合。
79. 什么是 Trie?用例?
用于前缀搜索(例如自动完成)的树状结构。
80. 栈和队列有什么区别?
栈:后进先出。队列:先进先出。用于解析、任务调度。
81. 如何检测图中的循环?
使用访问集或并查集的深度优先搜索。
82. 如何求两个数组的交集?
使用 Set 或 HashMap 来追踪公共元素。
83. Array 和 LinkedList 有什么区别?
Array:固定大小,访问速度快。LinkedList:动态大小,插入/删除速度快。
84. 什么是动态规划?
通过组合子问题的结果来解决问题(例如斐波那契数列)。
85. 什么是记忆化?
缓存昂贵函数调用的结果。
5. SQL 和数据库(15 个问题)
86. INNER JOIN 和 LEFT JOIN 有什么区别?
INNER 返回匹配的行。LEFT 返回左侧所有匹配项。
87. 什么是规范化?
结构化数据以减少冗余(1NF、2NF、3NF)。
88. 如何防止 Java 中的 SQL 注入?
使用PreparedStatements。避免字符串连接。
89. 什么是索引?它是如何工作的?
使用 B 树/哈希索引可以加速查询。
90. 聚集索引和非聚集索引有什么区别?
聚集索引:对实际数据进行排序。非聚集索引:独立的结构。
91. 数据库中的 ACID 是什么?
原子性、一致性、隔离性、持久性。
92. 解释隔离级别。
读未提交 < 读已提交 < 可重复读 < 可序列化。
93. 什么是事务?Spring 中如何管理事务?事务是
逻辑工作单元。通过 进行管理@Transactional。
94. 数据库中的死锁是什么?
两个事务互相等待对方的锁。
95. 如何分析慢查询?
使用EXPLAIN查询日志、监控工具。
96. JPQL 中的 有什么用JOIN FETCH?
通过获取相关实体来防止 N+1 问题。
97. 如何确保分布式数据库的一致性?
使用最终一致性、基于仲裁的读/写、两阶段提交 (2PC)。
98. 乐观锁和悲观锁有什么区别?
乐观锁:版本控制。悲观锁:行锁。
99. 何时使用 NoSQL 而不是 RDBMS?
对于非结构化数据,需要高可扩展性(例如 MongoDB、Cassandra)。
100. 主键和唯一键有什么区别?
主键:唯一标识行,不可为空。唯一键允许一个空值。
总结
读到这里?你准备好面试了吗?快收藏这些问答,在下一个重要机会到来之前重温一下吧
猜你喜欢
- 2025-06-12 《我的世界》迎15周年,Java+ 基岩版游戏国区五折售44.5元
- 2025-06-12 我的Java!越过山丘(越过山丘杨宗纬完整版)
- 2025-06-12 我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊
- 2025-06-12 Java反射+注解实现Entity类与Dto类相互转换
- 2025-06-12 Java开发200+个学习知识路线-史上最全(框架篇)
- 2025-06-12 年末将至,Java 开发者必须了解的 15 个Java 顶级开源项目
- 2025-06-12 Java实现 10 万+并发去重,持续优化
- 2025-06-12 java+上传整个文件夹的所有文件(java实现文件上传的三种方式)
- 2025-06-12 系列教材JAVA+J2SE+JSP+SSH+javaWEB+框架+CMS+SQL 免费教材分享
- 2025-06-12 Java让你遥遥领先的7个编程习惯(java编程100例)
- 06-13C++之类和对象(c++中类和对象的区别)
- 06-13C语言进阶教程:数据结构 - 哈希表的基本原理与实现
- 06-13C语言实现见缝插圆游戏!零基础代码思路+源码分享
- 06-13Windows 10下使用编译并使用openCV
- 06-13C语言进阶教程:栈和队列的实现与应用
- 06-13C语言这些常见标准文件该如何使用?很基础也很重要
- 06-13C语言 vs C++:谁才是编程界的“全能王者”?
- 06-13C语言无锁编程指南(c语言锁机代码)
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)