我有这个代码:
class ABC
{
public static void main(String[] args) {
Integer inta = new Integer(10);
Integer intb = new Integer(10);
if (inta <= intb) {
System.out.println("inta is less than intb");
}
if (inta >= intb) {
System.out.println("inta is greater than intb");
}
if (inta != intb) {
System.out.println("inta is not equal to intb");
}
}
}
该输出:
inta is less than intb
inta is greater than intb
inta is not equal to intb
有人能解释为什么会发生这种情况吗?一个物体怎么能同时相等和不相等呢?
它满足第一个和第二个,因为编译器需要用于大于(>
)或小于比较(<
)操作的基元类型,所以它自动从Integer
取消装箱到int
。因为您使用或等于运算符(<=
和>=
),所以条件为true。
它满足第三个条件,因为编译器检查两个Integer
对象,看看它们是否是同一个对象,因为它们不是,所以条件为true。
Wrapper对象是静态对象;如果对它们执行对象等价(==
),那么除非它们是完全相同的引用,否则永远是false
。
取消装箱是因为我们使用的是关系运算符,它将取消装箱为运算符可以尊重的类型——在本例中为int
。这种比较就好像你没有包装纸一样。
如果您使用Integer
可以通过使用valueOf()
进行缓存这一事实,事情就会变得有趣起来。
如果你的表情是这样的:
Integer inta = Integer.valueOf(10);
Integer intb = Integer.valueOf(10);
则执行inta == intb
将等于true
,因为这两个值都在[-128127]的缓存范围之间。
由于您试图查看一个值是否大于、大于或等于另一个值,请考虑使用Comparable
。Integer
是Comparable
实体,所以您可以简单地执行以下操作:
System.out.println(inta.compareTo(intb) < 0); // to check for a < b
System.out.println(inta.compareTo(intb) == 0); // to check for a == b
System.out.println(inta.compareTo(intb) > 0); // to check for a > b
使用inta.compareTo(intb)
并检查返回的值。
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#compareTo%28java.lang.Integer%29
例如
int res = inta.compareTo(intb);
if (res < 0)
{
System.out.println("inta is less than intb");
}
if (res > 0)
{
System.out.println("inta is greater than intb");
}
if (res != 0)
{
System.out.println("inta is not equal to intb");
}
重复我对OP的评论:前两个测试中使用的运算符是不正确的,因为它们测试的是"小于或等于"one_answers"大于,或等于",并将其更改为<和>将适用于这些情况,因为在这些情况下,底层int是未装箱的。但是,==正在检查它们是否是同一个对象,而事实并非如此,因此它将返回false
,除非您有类似inta == inta
的对象。