valueof 比 new 更优,因其利用缓存复用对象(如 integer 缓存 [-128,127])、节省内存与 gc 压力、语义清晰且支持统一异常处理;float/double 不缓存,boolean/byte/short/integer/long/character 有特定缓存范围。

Java 中包装类推荐使用 valueOf 方法而非构造函数(如 new Integer(10))来创建对象,主要是为了利用缓存机制、提升性能并保证对象复用。从 Java 5 开始,所有基本类型对应的包装类(Boolean、Byte、Short、Integer、Long、Character)都实现了缓存优化,Float 和 Double 则没有缓存。
为什么 valueOf 比 new 更优?
valueOf 是静态工厂方法,它内部会检查是否可复用已有对象:
-
自动缓存小整数:例如
Integer.valueOf(100)返回的是常量池中已存在的对象,而new Integer(100)每次都新建实例; - 节省内存与 GC 压力:避免重复创建相同值的对象;
- 语义更清晰:“获取一个表示该值的包装对象”比“新建一个对象”更准确;
-
支持 null 安全处理(如
Integer.valueOf(String)可抛出NumberFormatException,但不会返回 null,便于统一错误处理)。
各包装类的缓存范围
不同包装类缓存策略不同,需注意边界:
-
Boolean:只缓存true和false两个实例; -
Byte、Short、Integer、Long:默认缓存[-128, 127]区间内的值(Integer可通过 JVM 参数-Djava.lang.Integer.IntegerCache.high=xxx扩展上限); -
Character:缓存[0, 127]的字符(对应 ASCII); -
Float、Double:不缓存,每次调用valueOf都新建对象(因为浮点数相等判断复杂,且业务中极少需要复用)。
实际使用建议
日常编码中应统一用 valueOf 替代构造器:
- ✅ 推荐:
Integer i = Integer.valueOf(42);、Boolean b = Boolean.valueOf("true");; - ❌ 避免:
Integer i = new Integer(42);(已过时,编译警告)、new Boolean(true)(同理); - ⚠️ 注意字符串解析:
Integer.valueOf("123")等价于Integer.parseInt("123")再装箱,若字符串非法会抛异常,不是返回 null; - ? 自动装箱(如
Integer i = 123;)底层也调用valueOf,所以本质上和显式调用一致。
对比示例:Integer 的两种创建方式
以下代码能直观体现区别:
Integer a = Integer.valueOf(100); Integer b = Integer.valueOf(100); System.out.println(a == b); // true(引用同一缓存对象) Integer c = new Integer(100); Integer d = new Integer(100); System.out.println(c == d); // false(两个不同对象) Integer e = Integer.valueOf(200); Integer f = Integer.valueOf(200); System.out.println(e == f); // false(超出默认缓存范围,各自新建)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











