为什么'<','>'使用包装类而'=='不使用?
我知道'=='不适用于[-128,127]范围之外的值,因为在此范围内存在Integer对象的caching,如果值在范围内,则返回相同的引用。 但为什么'>','<','> =','<='即使在范围之外也能给出正确答案?
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
为什么发生这种情况?
<
, >
, <=
和>=
运算符仅为基元types定义。 因此,在包装types上使用它们会导致编译器将对象拆箱为原语。
意即
System.out.println(a>=b);
相当于
System.out.println(a.intValue()>=b.intValue());
但是,对于基本types和引用types,都存在==
和!=
运算符,因此使用它们来比较基本包装types的两个对象会比较引用而不是它们所包装的基本值。
Holger评论说,在引入自动装箱和自动拆箱之前,在Java语言中存在==
和!=
的对象引用的比较,但是之前的任何引用types都不支持与<
, >
, <=
和>=
进行比较自动拆箱被引入。
这意味着在Java的早期,你的代码片段的a>=b
不能通过编译(因为a
和b
不是原始的数字types)。 另一方面,你的a==b
片段仍然会通过编译并返回false
。
对于恰好是数字基元包装的引用types,改变==
和!=
的行为会改变现有代码的行为,从而破坏向后兼容性,这可能是未完成的原因。