2017-09-01 526 views
3

我想了解下面的代码的行为,当数值比较运算被用来在Java中比较2个Integer对象物体的比较。Java的自动装箱,并使用运营商

Integer i1 = new Integer(1); 
    Integer i2 = new Integer(1); 
    System.out.println(i1 == i2); 
    System.out.println(i1 > i2); 
    System.out.println(i1 >= i2); 

上面的代码的输出是:

false 
false 
true 

我明白了什么是发生在第一种情况下(对象实例的比较时这就是为什么它给假)。但为什么第二种和第三种情况是不同的,它是如何工作的?

+0

我对你的结果感到困惑。我认为JLS需要缓存和相同的对象,范围在-128到127之间的“Integers”。 https://stackoverflow.com/questions/20897020/why-integer-class-caching-values-in-the-range-128-to-127 – markspace

+0

@markspace自动装箱或调用'的valueOf只有当()'。使用'new'关键字创建的对象必须始终不同。 – shmosel

+0

@shmosel啊,对!我链接到的SO问题说“盒装”对象。谢谢你指出。 – markspace

回答

4

因为<,>,>=<=是数字比较,因此编译器知道它必须拆箱。

然而,==!=总是工作作为参考比较器对于非原始类型。

+0

二元数值提升(转换为数字)形成在<, <=, >进行,如([JLS 15.20.1(https://docs.oracle.com/javase/specs/jls/se8/html/指定> =操作数jls-15.html#jls-15.20.1)) 第二和第三个场景。但是,在!=和==的情况下,至少有一个操作数必须是数字类型才能进行升级。 – ayushi