Java Wrapper相等测试

时间:2009-01-19 05:05:43

标签: java wrapper

  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做准备时,需要明确这个概念。有人可以解释这种行为。谢谢。

5 个答案:

答案 0 :(得分:19)

在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

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

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

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

编辑:以下是Section 5.1.7Java Language Specification中的相关段落:

  

如果框中的值 p true,   falsebyte,范围内的char   \u0000\u007f,或者是int或short   在-128和127之间的数字,然后让    r1 r2 是任意两个的结果   p的拳击转换它始终是    r1 == r2

的情况

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

答案 3 :(得分:4)

答案 4 :(得分:0)

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

  

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

at WrapperTest.main(WrapperTest.java:5)

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

问候