integer.valueof() 优先复用缓存对象(-128~127),new integer() 总是新建实例;后者在java 9+弃用、java 14+移除,字符串转整数必须用valueof()或parseint()。

Integer.valueOf() 和 new Integer() 的核心区别在哪
本质是对象创建方式不同:前者优先复用缓存对象,后者每次新建实例。JVM 对 Integer 在 -128 到 127 范围内做了缓存(由 IntegerCache 实现),valueOf() 会查这个缓存;而 new Integer() 绕过缓存,强制在堆上分配新对象。
字符串转整数该用哪个方法
必须用 Integer.valueOf(String),不能用 new Integer(String) —— 后者在 Java 9+ 已被标记为 @Deprecated,编译会警告,且在 Java 14+ 中已彻底移除构造器重载。
-
Integer.valueOf("123")正常返回缓存或新Integer实例,推荐 -
new Integer("123")编译失败(Java 14+)或触发弃用警告(Java 9–13) - 若需基本类型
int,直接用Integer.parseInt("123"),不产生包装对象,更轻量
valueOf() 的缓存行为有哪些坑
缓存只对字面值范围有效,且仅作用于 valueOf(int) 和 valueOf(String),不覆盖所有构造路径。常见误判:
-
Integer a = Integer.valueOf(100); Integer b = Integer.valueOf(100); a == b→ true(同引用) -
Integer c = Integer.valueOf(200); Integer d = Integer.valueOf(200); c == d→ false(不同对象,仅值相等) -
Integer e = new Integer(100); Integer f = Integer.valueOf(100); e == f→ false(new总是新对象) - 缓存范围可通过 JVM 参数
-Djava.lang.Integer.IntegerCache.high=200扩展,但不建议依赖
实际开发中怎么选:parseInt、valueOf 还是自动拆箱
看用途和上下文:
立即学习“Java免费学习笔记(深入)”;
- 需要
int基本类型(如计算、数组索引)→ 用Integer.parseInt(str) - 需要
Integer对象(如集合元素、泛型参数、可能为 null)→ 用Integer.valueOf(str) - 避免写
(Integer)str或new Integer(str),它们要么编译不过,要么语义错误 - 注意异常:两者都抛
NumberFormatException,务必 try-catch 或提前校验字符串格式
最常被忽略的是:缓存行为只影响 == 判断,不影响 .equals() 或数值逻辑;但一旦混用 new 和 valueOf() 做引用比较,结果就不可靠。











