两个包装器对象如何相等,但不能同时相等

时间:2013-12-14 17:11:59

标签: java integer comparison

我有这段代码:

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

任何人都能解释为什么会这样吗?一个物体如何在同一时间相等而不相等?

3 个答案:

答案 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]的缓存范围之间。

由于您试图查看某个值是否大于,大于或等于另一个值,请考虑使用ComparableIntegerComparable实体,因此您只需执行此操作:

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的内容。