代码之家  ›  专栏  ›  技术社区  ›  Warrior

Java包装器相等性测试

  •  20
  • Warrior  · 技术社区  · 16 年前
      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做准备的时候,需要弄清楚背后的概念。有人能解释一下这种行为吗?谢谢。

    5 回复  |  直到 16 年前
        1
  •  19
  •   Ross    16 年前

    在爪哇中,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

        2
  •  6
  •   SCdF    16 年前

    基本上-127和127之间的整数是以这样一种方式“缓存”的,即当您使用这些数字时,总是在内存中引用相同的数字,这就是为什么 == 作品。

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

        3
  •  5
  •   Community CDub    7 年前

    @金枪鱼牧场是正确的。这个问题和这个问题一样 Python question . 要点是Java保持一个对象围绕从128到127的整数(Python,5到256),每次请求一个都返回相同的对象。如果你要求一个超出这个固定范围的整数,它每次都会给你一个新的对象。

    (记得 == 返回两个对象是否 事实上 同样的,同时 equals 比较其内容。)

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

    如果值 被装箱 true , false A byte A char 在射程内 \u0000 \u007f ,或int或short 数字介于-128和127之间,然后让 R1 R2 是任何两个的结果 拳击转换P。它总是 案件 R1 = R2 .

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

        5
  •  0
  •   sourcerebels    16 年前

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

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

    at WrapperTest.main(WrapperTest.java:5)
    

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

    问候语