23
  public class WrapperTest {

    public static void main(String[] args) {

        Integer i = 100;
        Integer j = 100;

        if(i == j)
            System.out.println("same");
        else
            System.out.println("not same");
    }

   }

上面的代码给出了same运行时的输出,但是如果我们将i和的值更改j为 1000,则输出将更改为not same. 当我为 SCJP 做准备时,需要弄清楚这背后的概念。有人可以解释这种行为吗。谢谢。

4

5 回答 5

21

在 Java 中,-128 到 127(含)之间的整数通常由同一个 Integer 对象实例表示。这是通过使用称为 IntegerCache 的内部类来处理的(包含在 Integer 类中,例如在调用 Integer.valueOf() 时或在自动装箱期间使用):

private static class IntegerCache {
    private IntegerCache(){}

    static final Integer cache[] = new Integer[-(-128) + 127 + 1];

    static {
        for(int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
    }
}

另见:http ://www.owasp.org/index.php/Java_gotchas

于 2009-01-19T05:14:16.817 回答
7

基本上 -127 和 127 之间的整数以这样的方式“缓存”,当你使用这些数字时,你总是在内存中引用相同的数字,这就是你==工作的原因。

该范围之外的任何整数都不会被缓存,因此引用是不一样的。

于 2009-01-19T05:12:41.453 回答
5

@tunaranch 是正确的。这也与此Python question中的问题相同。要点是 Java 为从 -128 到 127 的整数保留一个对象(Python 是 -5 到 256),并且每次您请求一个对象时都返回相同的对象。如果你要求一个超出这个固定范围的整数,它每次都会给你一个新对象。

(回想一下,==返回两个对象是否实际上相同,同时equals比较它们的内容。)

编辑:这是Java 语言规范第 5.1.7 节中的相关段落:

如果被装箱的值ptrue是, false, a byte, achar在 to 的范围内 \u0000\u007f或者是一个介于 -128 和 127 之间的 int 或 short 数,则令 r1r2是 p 的任意两次装箱转换的结果。r1 == r2总是如此。

请注意,这也描述了其他类型会发生什么。

于 2009-01-19T05:11:56.137 回答
4

这与平等和自动装箱有关:http ://web.archive.org/web/20090220142800/http://davidflanagan.com/2004/02/equality-and-autoboxing.html

于 2009-01-19T05:08:42.210 回答
0

您的代码无法编译。这就是我得到的:

线程“main”java.lang.Error 中的异常:未解决的编译问题:类型不匹配:无法从 int 转换为 Integer 类型不匹配:无法从 int 转换为 Integer

at WrapperTest.main(WrapperTest.java:5)

变量 i 和 j 是 Integer 对象的实例。不要使用“==”运算符比较对象的实例,而是使用“等于”方法。

问候

于 2009-01-19T08:53:20.510 回答