推荐使用 valueof 而非 new 创建包装类对象,因其利用缓存(如 integer[-128,127]、boolean常量等)复用对象、节省内存、支持==比较,而 new 总是新建对象;自动装箱也调用 valueof,new 构造器自 jdk 9 已弃用。

Java 中包装类(如 Integer、Boolean、Double 等)推荐使用 valueOf 方法而非 new 创建对象,主要是为了利用缓存机制、避免重复对象、提升性能和内存效率。
为什么 valueOf 比 new 更好
new 每次都会创建一个新对象,即使值相同;而 valueOf 在一定范围内会复用已缓存的对象(尤其是 Integer、Byte、Short、Character、Boolean),减少堆内存开销,并支持 == 比较(对缓存范围内的值有效)。
-
Integer.valueOf(100)和Integer.valueOf(100)返回同一个对象(因为 100 在 [-128, 127] 缓存范围内) -
new Integer(100)每次都新建对象,==比较结果为false -
Boolean.valueOf("true")总是返回常量Boolean.TRUE或Boolean.FALSE,绝不新建
各包装类的 valueOf 用法示例
所有基本类型包装类都提供了静态 valueOf 方法,参数支持基本类型或字符串(部分支持):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Integer.valueOf(42)—— 推荐,自动使用缓存 -
Integer.valueOf("123")—— 字符串解析,等价于Integer.parseInt("123")后装箱 -
Double.valueOf(3.14)或Double.valueOf("3.14") -
Boolean.valueOf(true)或Boolean.valueOf("false") -
Character.valueOf('A')—— 注意:Character缓存范围是 [0, 127]
注意缓存边界和陷阱
缓存不是万能的,需留意适用范围和行为差异:
-
Integer默认缓存 [-128, 127],超出此范围调用valueOf仍会新建对象(但仍是单例语义,不保证跨 JVM 复用) -
Long.valueOf(100)不缓存(JDK 8+ 默认不启用 Long 缓存,可通过-Djava.lang.Long.IntegerCache.high=xxx扩展,但极少使用) -
Float.valueOf(1.0f)和Double.valueOf(1.0)从不缓存,每次返回新对象 - 永远不要用
==比较Double或Float包装类对象,应使用equals或直接比基本值
自动装箱其实也调用 valueOf
当你写 Integer i = 100;,编译器会自动翻译为 Integer.valueOf(100);但写 Integer i = new Integer(100); 就绕过了优化,且该构造器自 JDK 9 起已被标记为 deprecated,明确不鼓励使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










