为什么'<','>'使用包装类,而'=='却没有?

Gau*_*hal 50 java

我知道'=='不适用于[-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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Era*_*ran 83

<,>,<=>=运营商都仅适用于原语类型定义的.因此,在包装器类型上使用它们会导致编译器将对象拆箱为基元.

这意味着

System.out.println(a>=b);
Run Code Online (Sandbox Code Playgroud)

相当于

System.out.println(a.intValue()>=b.intValue());
Run Code Online (Sandbox Code Playgroud)

但是,对于基本类型和引用类型都存在==!=运算符,因此使用它们来比较基本包装类型的两个对象比较引用而不是它们包装的基元值.

作为霍尔格评论,与对象引用的比较==!=在自动装箱和自动拆箱引入前的Java语言存在,但比较<,>,<=>=引入自动拆箱之前,不支持任何引用类型.

这意味着在Java的早期a>=b,您的代码片段不会通过编译(因为a并且b不是原始数字类型).另一方面,您的a==b代码片段仍然会通过编译并返回false.

改变的行为==,并!=为恰好是数字原语将改变现有代码的行为包装引用类型,从而打破向后兼容性,这可能是它没有这样做的原因.

  • 值得注意的是,在引入自动拆箱之前,使用`==`和`!=`来比较引用的可能性,因此无法定义它们来比较未装箱的值,因为这会破坏兼容性.如果没有这种遗产,可以定义一个不同的运算符进行参考比较,这是最简单的解决方案.不幸的是,那艘船航行了...... (6认同)