应使用基本类型而非包装类型声明循环变量和计数器,如用int、long、double代替Integer、Long、Double,避免自动装箱拆箱开销。

循环和计数器必须用基本类型
for 循环索引、累加变量、临时中间值,一律声明为 int、long、double 等原始类型,而不是 Integer、Long、Double。
错误写法:
Integer sum = 0;
for (Integer i = 0; i
每次 += 都触发一次拆箱 + 计算 + 装箱;i = 0 本身已装箱,i++ 还会反复拆箱再装箱。
正确写法:
int sum = 0;
for (int i = 0; i
集合操作优先选原生基本类型集合库
ArrayList
- 替代方案:用 Eclipse Collections 的 IntList、Trove 的 TIntArrayList,或直接用 int[]
- 若必须用标准集合且只做简单存取(不参与运算),可接受;但一旦涉及求和、过滤、比较等操作,应立刻切回基本类型上下文
- Stream 处理整数时慎用 Stream
,改用 IntStream
日志、三元表达式、方法参数要防隐式装箱
这些地方没写 new,却可能悄悄触发装箱,尤其在高频路径中:
- 日志:log.info("count: {}", count) —— 若 count 是 Integer,SLF4J 可能调用 toString() 或参与 boxing;传 int 才真正零开销
- 三元表达式:int x = flag ? obj.getValue() : 0 —— 若 getValue() 返回 Integer 且可能为 null,旧 JDK 中仍可能先拆箱导致 NPE;建议用 Objects.requireNonNullElse(obj.getValue(), 0)
- 方法参数:接收 Integer 的方法,若内部要做计算,应先转成 int 再处理,避免在运算链路中反复拆箱
缓存与比较要按规范来
Java 对 Byte、Short、Integer、Long(-128 ~ 127)、Character(0 ~ 127)、Boolean 做了缓存,但不能依赖它做逻辑判断:
- 创建时统一用 Integer.valueOf(100),禁用 new Integer(100)(JDK 9+ 已废弃)
- 比较两个包装类值,一律用 Objects.equals(a, b),不要用 ==;即使数值在缓存范围内,语义也不安全
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











