应优先使用 Integer.valueOf() 而非 new Integer(),因其支持缓存(-128 至 127)、更安全、语义清晰且 Java 9+ 中 new Integer() 已弃用;自动装箱和字符串解析也统一推荐 valueOf。

优先用 Integer.valueOf(),几乎不需要手动调用 new Integer()。
缓存范围内的整数(-128 到 127)必须用 valueOf
这个区间内的值会被 JVM 缓存复用。多次调用 Integer.valueOf(42) 得到的是同一个对象,== 比较返回 true;而 new Integer(42) 每次都新建对象,== 必为 false。缓存能显著减少对象创建开销和内存占用。
- 自动装箱(如
Integer i = 42;)底层就是调用valueOf - 字符串转整数也推荐
Integer.valueOf("123"),它内部先解析再缓存判断
超出缓存范围时,valueOf 仍更安全
比如 Integer.valueOf(200) 虽然不走缓存,但仍是标准、可读性强的构造方式。它语义明确:「我要一个表示该数值的 Integer 对象」;而 new Integer(200) 是低层、冗余的操作,且自 Java 9 起已被标记为 @Deprecated,官方明确不鼓励使用。
-
new Integer(int)构造器在 Java 9+ 中已弃用,编译会警告 - 即便需要新对象(极少见),也应通过
new Integer(200)的替代写法(如显式 new + 自定义包装)来表达意图,而非依赖过时 API
参数类型支持更广,valueOf 更灵活
Integer.valueOf() 支持 int 和 String 两种输入,例如 valueOf("100") 或 valueOf(100);而 new Integer() 只接受 int 或 String(后者在 Java 9+ 同样被弃用),且无缓存逻辑。
立即学习“Java免费学习笔记(深入)”;
- 处理用户输入或配置项时,直接用
Integer.valueOf(str)既简洁又统一 - 遇到非法字符串会抛
NumberFormatException,行为与parseInt一致,便于错误处理
比较时务必注意 == 和 equals 的区别
无论用哪种方式创建,只要涉及对象引用比较,就别依赖 == 判断“是否相等”。它只反映是否同一对象(地址相同),不是值相等:
-
Integer a = Integer.valueOf(100); Integer b = new Integer(100); a == b→false(即使值一样) - 安全做法是统一用
Objects.equals(a, b)或a.equals(b)(注意判空) - 若需数值比较,直接用
a.compareTo(b)或拆箱后用==(如a.intValue() == b.intValue())


















