我知道'=='不适用于[-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
.
改变的行为==
,并!=
为恰好是数字原语将改变现有代码的行为包装引用类型,从而打破向后兼容性,这可能是它没有这样做的原因.
归档时间: |
|
查看次数: |
3322 次 |
最近记录: |