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

主要区别在对象创建方式、内存使用和性能表现上。valueOf 优先复用缓存对象,new 每次都新建实例。
缓存机制决定是否复用对象
Long.valueOf(long l) 内部会对 [-128, 127] 范围内的值启用缓存(JDK 8 默认启用,可通过 JVM 参数调整上限)。超出该范围则仍会 new 出新对象。
- Long a = Long.valueOf(100); Long b = Long.valueOf(100); → a == b 为 true
- Long c = new Long(100); Long d = new Long(100); → c == d 为 false
- Long e = Long.valueOf(200); Long f = Long.valueOf(200); → e == f 为 false(超出缓存范围)
字符串转 Long 时行为一致但返回类型不同
Long.valueOf(String s) 和 new Long(String s) 都会先调用 parseLong(s, 10),再封装为 Long 对象。关键差异在于:前者走 valueOf(long) 分支(可能缓存),后者直接调用构造函数(必新建)。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- Long.valueOf("123") 返回 Long 对象,可能复用缓存
- new Long("123") 总是新建对象,不参与缓存
- 两者都可能抛 NumberFormatException,异常处理逻辑相同
自动装箱实际调用的就是 valueOf
写法 Long x = 127L;本质等价于 Long.valueOf(127L),所以它和显式调用 valueOf 的行为完全一致。而 new Long(127L) 是唯一绕过缓存的显式构造方式。
立即学习“Java免费学习笔记(深入)”;
- Long x = 127L; Long y = Long.valueOf(127L); → x == y 为 true
- Long z = new Long(127L); → x == z 为 false
- 对 128L 及以上,自动装箱也不缓存,x == Long.valueOf(128L) 为 false
推荐用 valueOf,避免 new Long
new Long() 已被标记为 @Deprecated(自 JDK 9 起),官方明确不建议使用。不仅因为缓存优势,还因它违背了包装类设计初衷——应通过静态工厂方法统一控制实例创建。
- valueOf 更省内存,尤其在循环或高频调用场景下
- valueOf 语义更清晰:强调“获取一个 Long 实例”,而非“新建一个”
- new Long(String) 在 JDK 9+ 编译会警告,运行虽仍可行但属过时实践

















