Java的自动装箱,并使用运营商
问题描述:
我想了解下面的代码的行为,当数值比较运算被用来在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 15.20.1(https://docs.oracle.com/javase/specs/jls/se8/html/指定> =操作数jls-15.html#jls-15.20.1)) 第二和第三个场景。但是,在!=和==的情况下,至少有一个操作数必须是数字类型才能进行升级。 – ayushi
我对你的结果感到困惑。我认为JLS需要缓存和相同的对象,范围在-128到127之间的“Integers”。 https://stackoverflow.com/questions/20897020/why-integer-class-caching-values-in-the-range-128-to-127 – markspace
@markspace自动装箱或调用'的valueOf只有当()'。使用'new'关键字创建的对象必须始终不同。 – shmosel
@shmosel啊,对!我链接到的SO问题说“盒装”对象。谢谢你指出。 – markspace