2

关于 java 中原始类型和自动装箱的问题的答案:

对于 biziclop:

类 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

4 回答 4

3

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

ilya 回答的启发,请参阅即将发​​布的 JDK7 第 638-643 行中Integer.valueOf() 的最新实际来源。

于 2011-03-08T21:06:20.423 回答
3

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

于 2011-03-08T21:16:49.060 回答
1

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

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

于 2011-03-08T21:07:30.063 回答
1

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

于 2011-03-08T21:10:52.927 回答