观看有效的Java视频我注意到盒装基元类型仅支持六个比较运算符中的四个<
,>
,<=
,>=
并且不支持&#39; t支持==
和!=
。
我的问题是为什么盒装基元不支持所有运算符?
答案 0 :(得分:7)
他们支持==
和!=
。他们只是没有做你期望的事情。
对于引用,==
和!=
会告诉您两个引用是否相等 - 即它们是否引用相同的对象。
class Thingy {}
Thingy a = new Thingy();
Thingy b = new Thingy();
System.out.println(a == b); // prints false, because a and b refer to different objects
Thingy c = b;
System.out.println(b == c); // prints true, because b and c refer to the same object
这适用于所有引用类型,包括盒装基元:
Integer a = new Integer(50);
Integer b = new Integer(50);
System.out.println(a == b); // prints false, because a and b refer to different objects
Integer c = b;
System.out.println(b == c); // prints true, because b and c refer to the same object
现在,引用不支持<
或>
或<=
或>=
:
Thingy a = new Thingy();
Thingy b = new Thingy();
System.out.println(a < b); // compile error
但是,盒装基元可以自动取消装箱,而未装箱的基元确实支持它们,因此编译器使用自动取消装箱:
Integer a = new Integer(42);
Integer a = new Integer(43);
System.out.println(a < b);
// is automatically converted to
System.out.println(a.intValue() < b.intValue());
==
或!=
不会发生这种自动拆箱,因为这些运营商在没有自动拆箱的情况下已经有效 - 他们只是不按预期执行。
答案 1 :(得分:2)
因为在java中,==
和!=
运算符总是通过引用来比较对象,而盒装类型是对象。