优先使用valueOf()装箱和xxxValue()拆箱,避免new构造器和循环中自动装箱;valueOf()复用缓存对象(默认-128~127),提升性能并减少GC压力。

用 valueOf() 装箱、用 xxxValue() 拆箱,是兼顾安全与性能的稳妥做法。关键不在“能不能自动”,而在于“什么时候该避免自动”。
优先用 valueOf() 代替 new 构造器
new Integer(100) 每次都新建对象,浪费堆内存;valueOf() 则复用缓存对象(Integer 默认缓存 -128 ~ 127),减少 GC 压力。
- ✅ 推荐:Integer i = Integer.valueOf(100);
- ❌ 避免:Integer i = new Integer(100);(已过时,JDK 9+ 标记为 deprecated)
- ⚠️ 注意:valueOf 缓存范围可配置(如 -XX:AutoBoxCacheMax=200),但默认只对小整数生效
避免在循环或高频路径中触发自动装箱
自动装箱看似简洁,但每次都会调用 valueOf();若在 for 循环里反复装箱,等于反复创建/查缓存对象。
- ❌ 不推荐: for (int i = 0; i
- ✅ 更优:提前构造好包装类对象池,或改用原始类型集合库(如 Eclipse Collections、Trove)
拆箱前务必判空,尤其从集合或方法返回值获取包装类时
自动拆箱本质是调用 intValue() 等方法,一旦对象为 null,立刻抛 NPE —— 这类异常常发生在 map.get(key) 或 Optional.orElse(null) 后直接赋值给基本类型。
立即学习“Java免费学习笔记(深入)”;
- ❌ 危险写法:int x = map.get("key"); // 若 key 不存在,map 返回 null → 拆箱时 NPE
- ✅ 安全写法:int x = map.getOrDefault("key", 0); 或 Integer v = map.get("key"); int x = (v != null) ? v : 0;
泛型场景下,明确区分使用场景
泛型必须用包装类(如 List
- 例如统计平均值:先 List
data = ...;再用 stream().mapToInt(Integer::intValue).average(),比遍历中逐个拆箱更高效 - 高吞吐服务中,可搭配原始类型专用集合(如 IntArrayList)绕过装箱开销



















