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 运行时,但是如果我们改变值 ij 到 1000 输出变为 not same. 。当我正在准备 SCJP 时,需要弄清楚这背后的概念。有人可以解释一下这种行为吗?谢谢。

有帮助吗?

解决方案

在Java中,-128和127(含)之间的整数,一般由相同的整数对象实例表示。

:这是通过使用称为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

其他提示

-127到127之间基本上整数由以这样的方式,当你使用这些数字,你总是指在内存中相同的号码,这就是“缓存”为什么你的作品==

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

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

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

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

如果值 p 被装箱是 true, false, , A byte, , A char 在范围中 \u0000\u007f, ,或-128至127之间的int或短数,然后让 r1r2 成为p的任何两个拳击转换的结果。总是这样 r1 == r2.

请注意,这也描述了其他类型发生的情况。

您的代码不编译。这是我所得到的:

  

异常在线程“主要” java.lang.Error的:未解决编译问题:       类型不匹配:不能转换从int到整数       类型不匹配:不能从int转换为整数

at WrapperTest.main(WrapperTest.java:5)

变量i和j是整数对象的实例。不使用“==”操作符比较对象的情况下,使用“等于”方法来代替。

问候

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top