为什么'<','>'使用包装类而'=='不使用?

我知道'=='不适用于[-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不能通过编译(因为ab不是原始的数字types)。 另一方面,你的a==b片段仍然会通过编译并返回false

对于恰好是数字基元包装的引用types,改变==!=的行为会改变现有代码的行为,从而破坏向后兼容性,这可能是未完成的原因。