【问题标题】:Integer.valueOf() better than new Integer() [duplicate]Integer.valueOf() 比 new Integer() [重复]
【发布时间】:2011-09-28 03:33:48
【问题描述】:

可能重复:
New Integer vs valueOf

我在几个地方读到 Integer.valueOf 比 new Integer() 更好,因为它允许编译器完成值的缓存。所以我什么时候应该使用 new Integer() 而不是 Integer.valueOf()。是否有我不应该使用 Interger.valueOf() 的原因/场景

谢谢

【问题讨论】:

标签: java


【解决方案1】:

不使用 Integer.valueOf(int) 的正当理由是,如果您的项目被限制使用 1.5 之前的 JDK 版本。

【讨论】:

    【解决方案2】:

    不,不存在应该使用new Integer() 的场景。如果您通过它们的包装对象标识来区分整数,那么您不太可能在做一些合理的事情。

    【讨论】:

    • 您永远不想创建不可变对象的重复副本。这是对内存的毫无意义的浪费。
    【解决方案3】:

    我能想到的唯一原因是您需要两个不同但相等的 Integer 对象。

    System.out.println(new Integer(1)==new Integer(1)); // false
    System.out.println(Integer.valueOf(1)==Integer.valueOf(1)); // true
    

    【讨论】:

    • 另外,new Integer(xxx) 是可预测的并且容易陷入逃逸分析,Integer.valueOf 是一个半智的决定,因为它不能被 EA 处理(不确定返回值是否为一个新对象与否)。要在标准 -128/+127 范围内添加更多盐,可以是自定义值(通过 -XX:AutoBoxCacheMax 或 -Djava.lang.Integer.IntegerCache.high)
    • 在实践中你为什么需要它?
    • @bestsss HotSpot(和其他实现)特别对待很多方法。我不明白他们为什么不应该在这里。
    【解决方案4】:

    当您需要不同的对象标识时,您可以使用 new。不使用时使用 valueOf。

    当你对同一个值多次调用 valueOf 时,JVM 可能,事实上在某些情况下,会一遍又一遍地给你同一个对象。当你使用新的,它不会。因此,如果您需要多个不同的 2 对象(例如,出于不同原因调用 wait on),请使用 new。

    另一方面,如果您使用Integer 而不是int 的唯一原因是有null 的可能性,或者存储在某个集合中,请使用valueOf

    【讨论】:

    • 我猜字符串也一样。
    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多