valueOf 方法比构造函数更高效,因其复用缓存对象(如 Integer 缓存 -128~127)、减少内存开销和 GC 压力;Boolean 直接返回常量,Float/Double 不缓存但语义更优;自动装箱即调用 valueOf,应统一避免 new 构造函数。

Java 中包装类的 valueOf 方法比直接使用构造函数(如 new Integer(10))更高效,核心在于它复用已缓存的对象,避免重复创建,从而减少内存开销和 GC 压力。
缓存机制让 valueOf 更快
从 Java 5 开始,Integer.valueOf(int)、Byte.valueOf(byte)、Short.valueOf(short)、Long.valueOf(long) 默认缓存了常用值范围内的对象:
-
Byte、Short、Integer、Long缓存范围是 -128 到 127(可通过 JVM 参数调整Integer.cache.high等扩大) -
Character.valueOf(char)缓存\u0000到\u007f(即 0–127) -
Boolean.valueOf(boolean)直接返回静态常量TRUE或FALSE,无对象创建 -
Float.valueOf(float)和Double.valueOf(double)不缓存,每次调用都新建对象,但依然推荐用valueOf—— 因为语义更清晰,且未来可能优化
构造函数每次都新建对象
使用 new Integer(5) 或 new Long(100L) 会强制创建新实例,即使值相同也无法复用:
- 绕过缓存机制,浪费堆内存
- 增加垃圾回收频率
- 导致
==比较不可靠(即使值相等,引用也不同)
例如:new Integer(100) == new Integer(100) 结果为 false;而 Integer.valueOf(100) == Integer.valueOf(100) 在缓存范围内结果为 true(仅限自动装箱或 valueOf 调用)。
立即学习“Java免费学习笔记(深入)”;
自动装箱其实调用的就是 valueOf
代码中写 Integer i = 100; 时,编译器会自动翻译成 Integer i = Integer.valueOf(100);。这意味着:
- 日常使用基本类型赋值给包装类时,性能已有保障
- 但显式调用构造函数(如
new Integer(100))会破坏这一优化,应主动避免 - 在工具方法、集合初始化、JSON 解析等场景中,优先选用
valueOf而非new
实际编码建议
统一用 valueOf 替代构造函数,尤其注意以下情况:
- 不要写
new Integer(x)、new Long(y)等,改用Integer.valueOf(x)、Long.valueOf(y) - 对可能超出缓存范围的值(如
Integer.valueOf(500)),虽然不命中缓存,但语义一致、可读性好,且未来 JDK 优化不影响兼容性 - 在循环或高频调用场景(如解析大量数字字符串),用
Integer.valueOf(s)代替new Integer(Integer.parseInt(s)) - 检查旧代码中是否残留
new Boolean(true)等写法,替换为Boolean.valueOf(true)或更简洁的Boolean.TRUE



















