🔥 基础篇:这些坑你踩过吗?
1. String的不可变性会引发什么问题?(面试率90%!!!)
你以为String s = "hello"
和new String("hello")
没区别?错!前者在常量池复用对象,后者强制在堆中创建新实例。举个血泪案例:
String s1 = "java";
String s2 = new String("java");
System.out.println(s1==s2); // false(内存地址不同)
内存泄漏警告:大量substring操作可能导致原始大数组无法释放!JDK 7u6后优化了实现,但老系统仍需警惕(超级重要)
2. 泛型擦除的实战影响
明明写了List<String>
,运行时却变成List
!类型检查仅在编译期,运行时可能抛出诡异的ClassCastException
。破解方法:
- 用
Class<T>
保留类型信息 - 通过方法签名传递类型(如Jackson的TypeReference)
3. try-with-resources的正确姿势
还在手动关闭流?2024年了你该这么写:
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
// 自动调用close()
} catch(...) { ... }
关键点:资源类必须实现AutoCloseable
接口(JDBC连接池亲测有效)
🚀 进阶篇:面试官最爱的连环追问
4. Lambda表达式底层原理(灵魂拷问预警!)
你以为Lambda只是语法糖?其实编译器会生成invokedynamic
指令!JVM使用LambdaMetafactory
动态生成匿名类。看个反编译实例:
javap -p -c MyClass.class
输出中会出现lambda$main$0
这样的合成方法(面试加分会用这个!)
5. 当Optional遇上NPE
别被伪Optional坑了!错误用法:
Optional<User> user = ...;
user.get().getName(); // 可能NPE
正确姿势:
user.map(User::getName).orElse("default");
黄金法则:永远不要直接调用get()
(项目血泪教训总结)
🛠️ 框架篇:Spring Boot 3.x必考点
6. 自动配置的黑魔法
面试官:@SpringBootApplication
背后有什么?三剑客:
@SpringBootConfiguration
(配置类标识)@ComponentScan
(组件扫描)@EnableAutoConfiguration
(加载META-INF/spring.factories)
实战技巧:自定义starter时要在spring.factories
中注册配置类
7. 响应式编程的坑
WebFlux虽好,但事务管理完全变天!传统@Transactional
失效,必须使用响应式事务:
@Transactional
public Mono<Void> updateUser(User user) {
// 错误!应该返回Publisher
}
正确应该用ReactiveTransactionManager
(项目迁移真实踩坑记录)
💻 JVM篇:调优不再是玄学
8. ZGC实战参数配置
新一代低延迟GC,这样配置才有效:
-XX:+UseZGC
-XX:MaxGCPauseMillis=10
-XX:ZAllocationSpikeTolerance=5
监控命令:jstat -gcutil <pid> 1000
(每秒打印GC状态)
9. 内存泄漏定位三板斧
jmap -histo:live <pid>
看对象分布jcmd <pid> GC.class_histogram
实时统计- Eclipse Memory Analyzer分析堆dump
典型案例:静态集合未清理、ThreadLocal滥用、连接池未关闭
⚡ 并发编程篇:高并发的秘密武器
10. 虚拟线程使用禁忌(Project Loom最新特性)
虽然可以创建百万级线程,但:
synchronized(obj) { // 会导致线程固定(pinning)
...
}
正确方式:改用ReentrantLock
(实测吞吐量提升300%)
11. CompletableFuture组合技巧
超时控制要这样写:
CompletableFuture.supplyAsync(() -> queryDB())
.completeOnTimeout(defaultValue, 1, TimeUnit.SECONDS)
.exceptionally(ex -> handleError(ex));
坑点警示:默认使用ForkJoinPool,IO密集型任务要自定义线程池!
🎯 高频考点Top5(2024版)
- 模块化系统(JPMS)的类加载变化 → 考察率85%
- Record类的序列化问题 → 项目应用率暴涨
- Switch模式匹配的编译优化 → JDK 17+特性
- Spring AOP代理失效场景 → 框架必问
- JVM内存屏障与happens-before → 并发基础
💡 备考建议(来自大厂面试官)
- 刷LeetCode时优先练字符串处理和树形结构(出现率最高)
- 准备3个真实项目难点案例(STAR法则描述)
- 每天手写1个单例模式变种(双重锁检查要会画内存图)
最后忠告:别死记答案!理解设计思想才是通关密钥(面试官会故意说错某个点看你能不能纠正)