优先使用基本类型而非包装类,循环中避免自动装箱;复用valueOf()缓存实例,禁用构造器;比较值用equals()而非==。

核心思路是:能用基本类型就不用包装类,循环和高频场景尤其要警惕自动装箱,优先复用已缓存的实例或改用原始类型集合。
优先使用基本类型而非包装类
自动装箱本质是调用 valueOf() 方法,而该方法对超出缓存范围(如 Integer 默认 -128~127)的值会新建对象。例如:
-
Integer sum = 0;在循环中累加,每次sum += i都触发装箱+拆箱+新对象创建 - 应改为
int sum = 0;,彻底避开包装类开销
慎用包装类在循环和聚合操作中
以下写法隐患明显:
-
List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10000; i++) list.add(i);→ 每次 add 都装箱一次,生成 10000 个 Integer 实例 - 替代方案:用
IntStream.range(0, 10000).boxed().collect(Collectors.toList())仅在必要时装箱;更优是直接用原始类型工具库(如 Eclipse Collections 或 Trove),避免装箱全程
理解并善用缓存机制,但不依赖它
Integer、Boolean 等类对小范围值做了缓存,可安全复用:
立即学习“Java免费学习笔记(深入)”;
-
Integer a = 100, b = 100;→a == b为 true(同引用) -
Integer x = 200, y = 200;→x == y为 false(不同对象) - 注意:缓存范围可被 JVM 参数调整(如
-XX:AutoBoxCacheMax=2000),但业务逻辑不应强依赖此行为;比较值请始终用equals(),避免==引发 bug
静态工厂方法优于构造器
构造器强制新建对象,而静态工厂(如 Boolean.valueOf()、Integer.valueOf())可复用已有实例:
- ❌
new Boolean(true)→ 每次都 new,已废弃 - ✅
Boolean.valueOf(true)→ 返回常量Boolean.TRUE - ✅
Integer.valueOf(120)→ 返回缓存对象;Integer.valueOf(500)虽不缓存,但也比new Integer(500)更规范,且未来可能优化


















