int转Integer推荐valueOf()(复用-128~127缓存),禁用new Integer()(Java9废弃);Integer转int须判空防NPE;泛型集合必须用Integer,高频计算优先用int。

Java 中 int 和 Integer 的转换看似简单,但用错容易抛异常、出逻辑 bug,甚至影响性能。关键不是“能不能转”,而是“什么时候该用哪种方式转”。
int 转 Integer:推荐用 valueOf(),别用 new
int 是基本类型,Integer 是对象。把 int 变成 Integer,叫“装箱”。有两类写法:
- ✅ 推荐:Integer.valueOf(int) —— 利用缓存机制,-128 到 127 的值直接复用对象,省内存、速度快
- ❌ 避免:new Integer(int) —— Java 9 起已废弃,每次新建对象,无缓存,浪费堆空间
示例:
int a = 42;
Integer A = Integer.valueOf(a); // ✅ 好习惯
Integer B = a; // ✅ 自动装箱,底层仍是 valueOf()
立即学习“Java免费学习笔记(深入)”;
Integer 转 int:小心 null,必须判空
把 Integer 变成 int,叫“拆箱”。看似直接赋值就行,但一旦 Integer 是 null,运行时立刻抛 NullPointerException。
错误写法:
Integer num = null;
int x = num; // ❌ 运行时报错
安全写法(任选其一):
- 三目运算判空:int x = (num != null) ? num : 0;
- Java 8+ Optional:int x = Optional.ofNullable(num).orElse(0);
- 使用 intValue() 前手动检查:if (num != null) { x = num.intValue(); }
数组之间转换:不能直接强转,要逐个处理
int[] 和 Integer[] 是完全不同的类型,无法强制转换或隐式转换,必须遍历赋值。
int[] → Integer[]:
int[] arr = {1, 2, 3};
Integer[] boxed = Arrays.stream(arr).boxed().toArray(Integer[]::new); // Java 8 流式写法
// 或传统循环:
Integer[] boxed2 = new Integer[arr.length];
for (int i = 0; i boxed2[i] = arr[i]; // 自动装箱}
Integer[] → int[]:
Integer[] nums = {10, 20, null, 30};
int[] primitives = Arrays.stream(nums)
.mapToInt(n -> n != null ? n : 0)
.toArray();
使用场景怎么选?看三点
不是所有地方都能混用,选错类型会埋坑:
- 泛型和集合必须用 Integer —— List<int> 编译不通过,只能是 List<Integer>
- 数据库字段可能为 null,优先用 Integer —— ResultSet.getObject("age") 返回 Integer,用 getInt() 遇到 null 会报 SQLException
- 高频计算、循环累加、数组索引,坚持用 int —— 避免反复装箱拆箱,减少 GC 压力。比如 sum += i 在 Integer 上做,比在 int 上慢数倍


















