我有这段代码:
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
任何人都能解释为什么会这样吗?一个物体如何在同一时间相等而不相等?
答案 0 :(得分:2)
它满足第一个和第二个,因为编译器需要基本类型用于大于(>
)或小于比较(<
)的操作,因此它从{{进行自动拆箱1}}到Integer
。因为您使用or-equal-to运算符(int
和<=
),所以条件为真。
它满足第三个,因为编译器检查两个>=
对象以查看它们是否是同一个对象,并且由于它们不是,因此条件为真。
答案 1 :(得分:1)
包装对象仍然是对象;如果一个人对它们执行对象等价(==
),那么除非它们是完全相同的引用,否则它将始终为false
。
发生取消装箱是因为我们正在使用relational operators,它将取消打包到操作员可以遵守的类型 - 在本例中为int
。比较发生就好像你没有包装器一样。
如果您通过valueOf()
使用Integer
can be cached这一事实,事情会变得有趣。
如果你的表达如此:
Integer inta = Integer.valueOf(10);
Integer intb = Integer.valueOf(10);
...然后执行inta == intb
将等于true
,因为这两个值都在[-128,127]的缓存范围之间。
由于您试图查看某个值是否大于,大于或等于另一个值,请考虑使用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
答案 2 :(得分:0)
使用inta.compareTo(intb)
并检查返回的值。
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#compareTo%28java.lang.Integer%29
e.g。
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的评论:前两个测试中使用的运算符不正确,因为它们测试“less和或等于”和“大于或等于< / em>“,并将其更改为&lt;和&gt;适用于那些因为在这些情况下底层int是未装箱的。但是,==正在检查它们是否是同一个对象,它们不是,所以它会返回false
,除非你有类似inta == inta
的内容。