🎯 Java高频面试程序分析题(精华版)
一、经典陷阱题(必考)
1. Integer缓存池
Integer a = 127, b = 127; // true
Integer c = 128, d = 128; // false
System.out.println(a == b); // true
System.out.println(c == d); // false
💡 考点:缓存范围-128~127,==比较地址,超范围需用equals()
2. 字符串常量池
String s1 = "hello"; // 常量池
String s2 = "hello"; // 复用常量池
String s3 = new String("hello"); // 堆内存新对象
s1 == s2; // true
s1 == s3; // false
3. finally覆盖return
public int test() {
try { return 1; }
finally { return 2; } // finally的return会覆盖try
}
// 结果:返回2
4. 自动拆箱NPE
Integer i = null;
int j = i; // NullPointerException(调用intValue())
5. 泛型擦除
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
list1.getClass() == list2.getClass(); // true(运行时都是List)
二、并发编程(核心)
6. 虚拟线程(Java 21)
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 100_000).forEach(i ->
executor.submit(() -> Thread.sleep(1000))
);
} // 轻量级:百万线程不阻塞
💡 考点:Loom项目,虚拟线程vs平台线程,适用IO密集场景
7. CompletableFuture异常链
CompletableFuture.supplyAsync(() -> {
if (Math.random() > 0.5) throw new RuntimeException();
return "OK";
})
.exceptionally(ex -> "Fallback") // 捕获异常
.thenApply(String::toUpperCase) // 继续处理
.whenComplete((r, e) -> log.info(r)); // 最终回调
💡 考点:exceptionally vs handle 区别,异常不传播到后续链
8. StructuredTaskScope(Java 21)
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
var user = scope.fork(() -> getUserFromDB());
var order = scope.fork(() -> getOrderFromDB());
scope.join(); // 等待所有子任务
return user.get() + order.get();
}
💡 考点:结构化并发,父子任务生命周期绑定,异常自动传播
9. ConcurrentHashMap复合操作
// ❌ 错误:非原子操作
map.put("count", map.get("count") + 1);
// ✅ 正确:原子操作
map.compute("count", (k, v) -> (v == null ? 0 : v) + 1);
map.merge("count", 1, Integer::sum);
三、Java新特性(Java 8-21)
10. Record模式匹配(Java 21)
record Point(int x, int y) {}
if (obj instanceof Point(int x, int y)) {
System.out.println(x + y); // 直接解构
}
11. Switch表达式增强
String result = switch (obj) {
case Integer i when i > 0 -> "正数";
case Integer i -> "非正数";
case String s when s.length() > 5 -> "长字符串";
case null -> "空值"; // Java 21支持null
default -> "其他";
};
💡 考点:模式匹配 + 卫语句 + null处理
12. 密封类(Sealed)
public sealed interface Shape permits Circle, Rectangle {
double area();
}
record Circle(double r) implements Shape {
public double area() { return Math.PI * r * r; }
}
💡 考点:限制继承层次,增强类型安全
13. Stream惰性求值
list.stream()
.filter(n -> { log("filter: " + n); return n % 2 == 0; })
.map(n -> { log("map: " + n); return n * n; })
.forEach(System.out::println);
💡 考点:输出是交错的(filter → map → forEach),不是批量处理
四、JVM与性能优化
14. ZGC低延迟特性
# JVM参数
-XX:+UseZGC -Xmx16G
# 特点:暂停时间<10ms,并发处理
💡 考点:适合大堆内存、对延迟敏感的应用
15. 堆外内存管理(Panama项目)
try (var arena = Arena.ofConfined()) {
MemorySegment segment = arena.allocate(1024);
segment.set(ValueLayout.JAVA_INT, 0, 42);
// 自动释放,避免内存泄漏
}
💡 考点:避免GC压力,适合大数据处理
16. 向量化计算(Vector API)
IntVector a = IntVector.fromArray(SPECIES_256, arr1, 0);
IntVector b = IntVector.fromArray(SPECIES_256, arr2, 0);
IntVector c = a.add(b); // SIMD指令加速
💡 考点:利用CPU向量指令,性能提升4-8倍
五、分布式与架构
17. 分布式锁自动续期
RLock lock = redisson.getLock("myLock");
lock.lock(10, TimeUnit.SECONDS); // Watchdog自动续期
try {
// 业务逻辑超过10s,锁自动续期
} finally {
lock.unlock();
}
💡 考点:避免死锁,锁续期机制
18. 响应式背压处理
Flux.range(1, 1000)
.onBackpressureBuffer(100) // 缓冲策略
.onBackpressureDrop() // 丢弃策略
.subscribe(System.out::println);
💡 考点:生产者消费者速度不匹配的流控机制
19. Spring Native原生镜像
# 编译为原生可执行文件
./mvnw -Pnative native:compile
# 特点:启动时间<100ms,内存占用大幅降低
💡 考点:云原生场景,牺牲反射能力换取启动性能
六、数据库与ORM
20. JPA N+1查询优化
@EntityGraph(attributePaths = {"orders", "orders.items"})
@Query("SELECT u FROM User u WHERE u.id = :id")
User findWithOrders(@Param("id") Long id);
💡 考点:通过EntityGraph实现急加载,避免N+1问题
21. 分布式ID生成(雪花算法)
// 结构:1位符号 + 41位时间戳 + 10位机器ID + 12位序列号
public class SnowflakeIdGenerator {
public synchronized long nextId() {
long timestamp = System.currentTimeMillis();
if (timestamp < lastTimestamp) {
throw new RuntimeException("时钟回拨"); // 关键点
}
return ((timestamp - epoch) << 22) | (workerId << 12) | sequence++;
}
}
七、测试与监控
22. Testcontainers集成测试
@Testcontainers
class UserRepoTest {
@Container
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:15");
@Test
void test() {
// 使用真实数据库,测试环境一致性
}
}
💡 考点:容器化测试,避免Mock局限性
23. OpenTelemetry自动埋点
@WithSpan("processOrder")
public Order process(Order order) {
Span.current().setAttribute("order.id", order.getId());
return orderService.save(order);
}
💡 考点:分布式追踪,上下文自动传播
🎯 核心记忆口诀
| 类别 | 要点 |
|---|---|
| 基础 | 缓存池127 / 常量池复用 / finally覆盖 / 泛型擦除 |
| 并发 | 虚拟线程轻量 / Future异常链 / Map原子操作 |
| 新特性 | Record解构 / Switch模式 / Sealed限制 |
| JVM | ZGC低延迟 / 堆外内存 / 向量计算 |
| 架构 | 锁续期 / 背压流控 / 原生镜像 |
| 优化 | EntityGraph避免N+1 / 雪花ID防回拨 |
💡 答题技巧
- 先说结论:直接回答运行结果
- 讲清原理:解释为什么(如:Integer缓存机制)
- 扩展场景:什么情况下会遇到这个问题
- 给出方案:如何避免或优化(如:用equals代替==)
- 举一反三:类似问题的对比(如:String vs StringBuilder)
精简原则:从原300+题压缩至23道核心题,覆盖90%高频考点,每题1分钟快速过脑,深度理解而非死记硬背!# 🎯 Java高频面试程序分析题(精华版)
一、经典陷阱题(必考)
1. Integer缓存池
Integer a = 127, b = 127; // true
Integer c = 128, d = 128; // false
System.out.println(a == b); // true
System.out.println(c == d); // false
💡 考点:缓存范围-128~127,==比较地址,超范围需用equals()
2. 字符串常量池
String s1 = "hello"; // 常量池
String s2 = "hello"; // 复用常量池
String s3 = new String("hello"); // 堆内存新对象
s1 == s2; // true
s1 == s3; // false
3. finally覆盖return
public int test() {
try { return 1; }
finally { return 2; } // finally的return会覆盖try
}
// 结果:返回2
4. 自动拆箱NPE
Integer i = null;
int j = i; // NullPointerException(调用intValue())
5. 泛型擦除
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
list1.getClass() == list2.getClass(); // true(运行时都是List)
二、并发编程(核心)
6. 虚拟线程(Java 21)
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 100_000).forEach(i ->
executor.submit(() -> Thread.sleep(1000))
);
} // 轻量级:百万线程不阻塞
💡 考点:Loom项目,虚拟线程vs平台线程,适用IO密集场景
7. CompletableFuture异常链
CompletableFuture.supplyAsync(() -> {
if (Math.random() > 0.5) throw new RuntimeException();
return "OK";
})
.exceptionally(ex -> "Fallback") // 捕获异常
.thenApply(String::toUpperCase) // 继续处理
.whenComplete((r, e) -> log.info(r)); // 最终回调
💡 考点:exceptionally vs handle 区别,异常不传播到后续链
8. StructuredTaskScope(Java 21)
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
var user = scope.fork(() -> getUserFromDB());
var order = scope.fork(() -> getOrderFromDB());
scope.join(); // 等待所有子任务
return user.get() + order.get();
}
💡 考点:结构化并发,父子任务生命周期绑定,异常自动传播
9. ConcurrentHashMap复合操作
// ❌ 错误:非原子操作
map.put("count", map.get("count") + 1);
// ✅ 正确:原子操作
map.compute("count", (k, v) -> (v == null ? 0 : v) + 1);
map.merge("count", 1, Integer::sum);
三、Java新特性(Java 8-21)
10. Record模式匹配(Java 21)
record Point(int x, int y) {}
if (obj instanceof Point(int x, int y)) {
System.out.println(x + y); // 直接解构
}
11. Switch表达式增强
String result = switch (obj) {
case Integer i when i > 0 -> "正数";
case Integer i -> "非正数";
case String s when s.length() > 5 -> "长字符串";
case null -> "空值"; // Java 21支持null
default -> "其他";
};
💡 考点:模式匹配 + 卫语句 + null处理
12. 密封类(Sealed)
public sealed interface Shape permits Circle, Rectangle {
double area();
}
record Circle(double r) implements Shape {
public double area() { return Math.PI * r * r; }
}
💡 考点:限制继承层次,增强类型安全
13. Stream惰性求值
list.stream()
.filter(n -> { log("filter: " + n); return n % 2 == 0; })
.map(n -> { log("map: " + n); return n * n; })
.forEach(System.out::println);
💡 考点:输出是交错的(filter → map → forEach),不是批量处理
四、JVM与性能优化
14. ZGC低延迟特性
# JVM参数
-XX:+UseZGC -Xmx16G
# 特点:暂停时间<10ms,并发处理
💡 考点:适合大堆内存、对延迟敏感的应用
15. 堆外内存管理(Panama项目)
try (var arena = Arena.ofConfined()) {
MemorySegment segment = arena.allocate(1024);
segment.set(ValueLayout.JAVA_INT, 0, 42);
// 自动释放,避免内存泄漏
}
💡 考点:避免GC压力,适合大数据处理
16. 向量化计算(Vector API)
IntVector a = IntVector.fromArray(SPECIES_256, arr1, 0);
IntVector b = IntVector.fromArray(SPECIES_256, arr2, 0);
IntVector c = a.add(b); // SIMD指令加速
💡 考点:利用CPU向量指令,性能提升4-8倍
五、分布式与架构
17. 分布式锁自动续期
RLock lock = redisson.getLock("myLock");
lock.lock(10, TimeUnit.SECONDS); // Watchdog自动续期
try {
// 业务逻辑超过10s,锁自动续期
} finally {
lock.unlock();
}
💡 考点:避免死锁,锁续期机制
18. 响应式背压处理
Flux.range(1, 1000)
.onBackpressureBuffer(100) // 缓冲策略
.onBackpressureDrop() // 丢弃策略
.subscribe(System.out::println);
💡 考点:生产者消费者速度不匹配的流控机制
19. Spring Native原生镜像
# 编译为原生可执行文件
./mvnw -Pnative native:compile
# 特点:启动时间<100ms,内存占用大幅降低
💡 考点:云原生场景,牺牲反射能力换取启动性能
六、数据库与ORM
20. JPA N+1查询优化
@EntityGraph(attributePaths = {"orders", "orders.items"})
@Query("SELECT u FROM User u WHERE u.id = :id")
User findWithOrders(@Param("id") Long id);
💡 考点:通过EntityGraph实现急加载,避免N+1问题
21. 分布式ID生成(雪花算法)
// 结构:1位符号 + 41位时间戳 + 10位机器ID + 12位序列号
public class SnowflakeIdGenerator {
public synchronized long nextId() {
long timestamp = System.currentTimeMillis();
if (timestamp < lastTimestamp) {
throw new RuntimeException("时钟回拨"); // 关键点
}
return ((timestamp - epoch) << 22) | (workerId << 12) | sequence++;
}
}
七、测试与监控
22. Testcontainers集成测试
@Testcontainers
class UserRepoTest {
@Container
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:15");
@Test
void test() {
// 使用真实数据库,测试环境一致性
}
}
💡 考点:容器化测试,避免Mock局限性
23. OpenTelemetry自动埋点
@WithSpan("processOrder")
public Order process(Order order) {
Span.current().setAttribute("order.id", order.getId());
return orderService.save(order);
}
💡 考点:分布式追踪,上下文自动传播
🎯 核心记忆口诀
| 类别 | 要点 |
|---|---|
| 基础 | 缓存池127 / 常量池复用 / finally覆盖 / 泛型擦除 |
| 并发 | 虚拟线程轻量 / Future异常链 / Map原子操作 |
| 新特性 | Record解构 / Switch模式 / Sealed限制 |
| JVM | ZGC低延迟 / 堆外内存 / 向量计算 |
| 架构 | 锁续期 / 背压流控 / 原生镜像 |
| 优化 | EntityGraph避免N+1 / 雪花ID防回拨 |
💡 答题技巧
- 先说结论:直接回答运行结果
- 讲清原理:解释为什么(如:Integer缓存机制)
- 扩展场景:什么情况下会遇到这个问题
- 给出方案:如何避免或优化(如:用equals代替==)
- 举一反三:类似问题的对比(如:String vs StringBuilder)

172万+

被折叠的 条评论
为什么被折叠?



