两个包装器对象怎么可能相等,但又不同时相等



我有这个代码:

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

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

使用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的对象。

最新更新