语法糖不改变语义,只让代码更简洁;理解「编译后长什么样」有助于调试字节码、排查泛型擦除与性能问题。

核心概念

常见糖:增强 for → 迭代器循环;自动装箱/拆箱Integer.valueOf/intValue泛型 → 擦除+桥方法;枚举 → 合成类与静态数组;try-with-resources → finally 关闭;Lambdainvokedynamic + 函数式接口。Switch 字符串/模式(新 JDK)同样是编译期变换。

关键机制与实践

javap -c 或 IDE 反编译查看脱糖结果。自动装箱在循环里可能产生大量临时对象;Integer 缓存 -128~127 导致 ==equals 表现不一致。增强 for 遍历 ConcurrentModificationException 时在并发修改集合会 fail-fast(除非用并发容器或迭代器 remove 规则)。

1
2
3
// 源码:for (String s : list) { ... }
// 近似:for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
// String s = it.next(); ... }

常见误区与小结

  • 认为 Lambda「就是匿名内部类」(JDK 8 起实现机制不同)。
  • 在 null 上自动拆箱 NPE。
  • 枚举比较用 == 可以,但序列化/反射构造枚举需知单例保证。

读源码与调优时,把糖还原成 JVM 看得懂的形式,很多「玄学」行为就清楚了。