integer 转 int 应用 intvalue() 但须判空防 npe;int 转 integer 必用 integer.valueof()(非 new),因其启用 -128~127 缓存;字符串转数字依需求选 parseint()(得 int)或 valueof()(得 integer);集合操作依赖自动装箱,禁用 new integer()。

int 转 Integer 用 Integer.valueOf(),别用 new Integer()
Java 5 之后,Integer.valueOf(int) 是标准且推荐的方式;new Integer(int) 已被废弃(自 Java 9 起标记为 @Deprecated),不仅性能差,还绕过缓存机制。
原因在于 Integer.valueOf() 内部使用了 IntegerCache:对 -128 到 127 范围内的值,直接复用已有对象,节省堆内存和 GC 压力;而 new 每次都新建对象,哪怕值相同也地址不同。
常见错误现象:new Integer(100) == new Integer(100) 返回 false,但 Integer.valueOf(100) == Integer.valueOf(100) 返回 true(在缓存范围内)。
- ✅ 正确写法:
Integer i = Integer.valueOf(42); - ✅ 自动装箱也安全(编译器自动转成
valueOf):Integer i = 42; - ❌ 避免写法:
Integer i = new Integer(42);(无必要、低效、易引发 == 判断陷阱)
Integer 转 int 用 .intValue(),但要注意 null 安全
Integer 是引用类型,默认可为 null;而 int 是基本类型,不能为 null。直接调用 intValue() 前若未判空,运行时抛 NullPointerException——这是线上最常被忽略的空指针来源之一。
- ⚠️ 危险写法:
int x = someInteger.intValue();(someInteger为null时崩溃) - ✅ 推荐写法(显式判空):
int x = (someInteger != null) ? someInteger.intValue() : 0; - ✅ 或用
Objects.requireNonNullElse()(Java 9+):int x = Objects.requireNonNullElse(someInteger, 0).intValue();
parseInt() 和 valueOf() 都能转字符串,但返回类型不同
Integer.parseInt(String) 返回 int,Integer.valueOf(String) 返回 Integer。二者都要求字符串严格符合整数格式,否则抛 NumberFormatException;区别只在返回值是否包装。
- 需要基本类型(如计算、数组索引)→ 用
parseInt():int n = Integer.parseInt("123"); - 要放进集合或需 null 可控 → 用
valueOf():Integer n = Integer.valueOf("123"); - ⚠️ 注意:
Integer.valueOf("123")和Integer.parseInt("123")对非法输入行为一致,但前者多一次装箱(不过通常可忽略)
集合里存 int 必须靠 Integer,但别手动 new
ArrayList<int></int> 合法吗?不合法。泛型不接受基本类型,所以必须用 ArrayList<integer></integer>。这时往里 add int 值(如 list.add(5))会触发自动装箱——编译器悄悄替你调了 Integer.valueOf(5)。
立即学习“Java免费学习笔记(深入)”;
- ✅ 安全高效:
List<integer> list = new ArrayList(); list.add(100);</integer> - ❌ 不必要且有害:
list.add(new Integer(100));(绕过缓存,增加 GC) - ⚠️ 性能提示:高频增删小整数(比如循环中 add 0~100)时,缓存范围(-128~127)内对象复用明显;超范围则每次新建,但影响通常微乎其微,除非极端场景
真正容易被忽略的是缓存边界外的 == 判断,以及 null 拆箱——这两处不是语法错误,却常在运行时才暴露。写的时候多看一眼变量是否可能为 null,比较时优先用 equals() 而非 ==,就避开了大半坑。










