我知道'=='不适用于[-128,127]范围之外的值,因为在此范围内有一个由Integer对象维护的缓存,如果value在该范围内,则返回相同的引用。但是为什么'>','<','> =','< ='会在范围之外给出正确答案?
Integer a=150;
Integer b=150;
System.out.println(a==b); //returns false
Integer a=150;
Integer b=150;
System.out.println(a>=b); // returns true
为什么会这样?
答案 0 :(得分:84)
<
,>
,<=
和>=
运算符仅定义为基本类型。因此,在包装器类型上使用它们会导致编译器将对象拆箱为基元。
这意味着
System.out.println(a>=b);
相当于
System.out.println(a.intValue()>=b.intValue());
但是,基本类型和引用类型都存在==
和!=
运算符,因此使用它们比较基本包装类型的两个对象来比较引用而不是它们包装的原始值。 / p>
正如Holger评论的那样,在引入自动装箱和自动拆箱之前,Java语言中存在对象引用与==
和!=
的比较,但与<
进行比较,{{在引入自动拆箱之前,任何引用类型都不支持1}},>
和<=
。
这意味着在Java的早期,代码片段的>=
将不会通过编译(因为a>=b
和a
不是原始数字类型)。另一方面,您的b
代码段仍然会通过编译并返回a==b
。
更改恰好是数字基元包装的引用类型的false
和==
的行为会改变现有代码的行为,从而破坏向后兼容性,这可能就是它的原因所在。完成了。