Integer.valueOf()比new Integer()更好

5

可能是重复的问题:
New Integer vs valueOf

我在一些地方读到过,Integer.valueOf比new Integer()更好,因为它允许编译器对值进行缓存。那么应该何时使用new Integer()而不是Integer.valueOf()呢?是否存在某种原因/场景,在这种情况下不应使用Interger.valueOf()?

谢谢


1
你能参考一下这几个地方吗? - Nanne
你在哪里读到这个的? - Oliver Charlesworth
这里是一个参考链接:http://pmd.sourceforge.net/rules/migrating.html#IntegerInstantiation - artbristol
其中之一:http://tech.puredanger.com/2007/02/01/valueof/ - javanerd
4个回答

5
当您需要不同的对象标识时,请使用 new。当您不需要时,请使用 valueOf。
在同一值上多次调用 valueOf 时,JVM 可能会(实际上在某些情况下会)一遍又一遍地给您相同的对象。但如果您使用 new,则不会这样。因此,如果您需要几个不同的 2 对象(例如为不同的原因调用 wait),请使用 new。
另一方面,如果您使用 Integer 而不是 int 的唯一原因是具有 null 的可能性或存储在某些集合中,请使用 valueOf。

我猜字符串也是一样的。 - John Eipe

5
不,没有情况需要使用new Integer()。如果你通过包装对象的身份来区分整数,那么你很可能没有在做一个合理的事情。

你永远不想创建不可变对象的重复副本。这是一种毫无意义的内存浪费。 - ncmathsadist

1
我能想到的唯一理由是需要两个不同但相等的整数对象的情况。
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则是一个愚蠢的决定,因为它无法进行逃逸分析(不确定返回值是否为新对象)。更糟糕的是,标准的-128 / +127范围可以是自定义值(通过-XX:AutoBoxCacheMax或-Djava.lang.Integer.IntegerCache.high)。 - bestsss
在实践中,你为什么需要那个呢? - Raedwald
@bestsss HotSpot(以及其他实现)特别处理很多方法。我不明白为什么他们在这里不应该这样做。 - Tom Hawtin - tackline

0
使用Integer.valueOf(int)的一个有效理由是,如果您的项目被限制在1.5之前的JDK版本中使用,则不能使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接