为什么此示例中的Integer.valueOf(...)比较返回不同的值?

时间:2011-03-08 21:02:39

标签: java autoboxing

从答案question about primitive types and autoboxing in java

  

for biziclop:

     

class biziclop {

public static void main(String[] args) {
    System.out.println(new Integer(5) == new Integer(5));
    System.out.println(new Integer(500) == new Integer(500));

    System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
    System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}
     

}

     

结果:

C:\Documents and Settings\glow\My Documents>java biziclop
false
false
true
false

C:\Documents and Settings\glow\My Documents>

为什么?

4 个答案:

答案 0 :(得分:3)

Integer.valueof根据Java语言规范的要求缓存对象的值为零。

受到ilya's answer的启发,请参阅即将发​​布的JDK7中的the latest, actual source for Integer.valueOf(),第638-643行。

答案 1 :(得分:3)

参见Integer.valueOf实现:http://docjar.com/html/api/java/lang/Integer.java.html(850s行)

答案 2 :(得分:1)

您应该使用equal方法而不是==运算符。 ==测试两个对象是否相等,但是你创建了具有相同值的不同对象,并且需要equal()方法来比较对象的值。

更新:
Integer.valouOf(5)Integer.valouOf(500)的不同行为的原因确实是Integer实现使用大小为-128..127的静态valueOfCache。
从Java 7开始,可以使用命令行参数-XX:AutoBoxCacheMax=<size>

进行配置

答案 3 :(得分:1)

Integer.valueOf缓存值,特别是-128到127。