两个包装对象如何既相等又不相等?

3

我有这段代码:

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
这与缓存无关。 - assylias
@assylias 我尝试了一下,得到了以下输出 inta小于intb inta大于intb - Jigar
1
<= 表示“小于等于”, >= 表示“大于等于”。而 == 用于检查它们是否为同一对象,但实际并非如此。应该使用 compareTo() 方法来比较,并检查其返回的值。 - splrs
2
@cole 不是这就是 OP 所做的并得到了 false 吗?我认为你误解了缓存适用的位置。 - Sotirios Delimanolis
@Sotirios 我可能误解了它,因为在我的编程中我尽量避免使用包装类。 - Cole Tobin
显示剩余2条评论
3个回答

2
它满足第一和第二个条件,因为编译器需要原始类型来进行大于(>)或小于(<)比较操作,所以它将Integer自动解包为int。由于您使用了或等于运算符(<=>=),所以条件为真。
它满足第三个条件,因为编译器检查两个Integer对象是否为同一对象,由于它们不是同一个对象,所以条件为真。

1
包装对象仍然是对象;如果对它们执行对象等价性(==),除非它们是完全相同的引用,否则结果总是false
拆箱发生是因为我们使用了关系运算符,它们将拆箱为可以被运算符识别的类型 - 在这种情况下是int。比较的方式就好像没有包装器一样。
如果你利用了通过使用valueOf()缓存Integer这个事实,情况就会变得有趣。
如果您的表达式如下所示:
Integer inta = Integer.valueOf(10);
Integer intb = Integer.valueOf(10);

如果执行inta == intb,由于两个值都在缓存范围[-128, 127]之间,结果将等于true

如果您试图查看一个值是否大于、大于或等于另一个值,则考虑使用ComparableInteger是一个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

0

使用 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");
}

重申一下我的评论:前两个测试中使用的运算符是不正确的,因为它们测试的是“小于等于”和“大于等于”,将它们更改为<和>可以在这些情况下对基础int进行拆箱。然而,==检查它们是否是相同的对象,但它们不是,所以除非你有像inta == inta这样的东西,否则它将返回false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接