10

我是一个java新手,对下面的例子很困惑。可以认为“==”符号将比较整数之间的值和来自int的“自动装箱”整数之间的值,并比较整数之间的引用地址吗?

双打和0/0呢?

import edu.princeton.cs.introcs.*;

public class Autoboxing {

    public static void cmp(Integer first, Integer second) {
        if (first < second)
            StdOut.printf("%d < %d\n", first, second);
        else if (first == second)
            StdOut.printf("%d == %d\n", first, second);
        else if (first > second)
            StdOut.printf("%d > %d\n", first, second);
        else
            StdOut.printf("%d and %d are incomparable\n", first, second);
    }

    public static void main(String[] args) {
        cmp(new Integer(42), 43);
        cmp(new Integer(42), new Integer(42));
        cmp(43, 43);
        cmp(142, 142);

        Integer a0 = 1000;
        int b0 = 1000;
        Integer c0 = 1000;
        StdOut.println("a0==b0?" + (a0==b0));
        StdOut.println("a0==c0?" + (a0==c0));
        StdOut.println("b0==c0?" + (b0==c0));

        double x1 = 0.0, y1 = -0.0;
        Double a1 = x1, b1 = y1;
        StdOut.println(x1 == y1);
        StdOut.println(a1.equals(b1));

        double x2 = 0.0/0.0, y2 = 0.0/0.0;
        Double a2 = x2, b2 = y2;
        StdOut.println(x2 != y2);
        StdOut.println(!a2.equals(b2));
    }

}

结果是:

42 < 43
42 and 42 are incomparable
43 == 43
142 and 142 are incomparable
=====
a0==b0?true
a0==c0?false
b0==c0?true
=====
true
false
=====
true
false
4

4 回答 4

25

arithmetic operators当,comparison operators出现时会发生拆箱。

例如:

Integer a = 10;
a = a+10; //1.unboxing a to int 2.calculate a+10 3.boxing 20 to Integer.
System.out.print(a > 10); //1.unboxing a to int 2. compare

但是什么时候==出现,就看情况了。

如果拳击类型出现在 上both side,它会比较the reference。但是如果基础类型出现在 上one side,并且另一边是拳击类型,则拳击类型将unboxing成为基本类型。

例如:

Integer a = new Integer(129);
Integer b = new Integer(129);
System.out.println(a == b); // compare reference return false
System.out.println(a == 129); // a will unboxing and compare 129 == 129 return true

PS:在Java.lang.Integer 缓存中支持 JLS 要求的 -128 和 127(含)之间的值的自动装箱的对象标识语义。 查看源代码

所以:

Integer a = 127;
Integer b = 127; //cached, the same as b a==b return ture

Integer c = 129;
Integer d = 129; // not cached, c==d return false
于 2012-09-24T06:36:42.323 回答
12

这是自动装箱和拆箱教程。

你也可以通过JLS#5.1.7。拳击转换JLS#5.1.8。拆箱转换

0.0 / 0.0是你至少在数学NaN上无法比较。infinity我想这就是为什么这种比较不起作用的原因。

来自JLS #4.2.3。浮点类型、格式和值

正零和负零比较相等;因此表达式 0.0==-0.0 的结果为真,而 0.0>-0.0 的结果为假

NaN 是无序的,所以:

  • 如果一个或两个操作数都是 NaN,则数值比较运算符 <、<=、> 和 >= 返回 false(第 15.20.1 节)。

  • 如果任一操作数为 NaN,则相等运算符 == 返回 false。

  • 特别是,如果 x 或 y 为 NaN,则 (x=y) 将为假。

  • 如果任一操作数为 NaN(第 15.21.1 节),则不等式运算符 != 返回 true。

  • 特别是,当且仅当 x 为 NaN 时 x!=x 为真。

如果您检查Double#equals方法,它有两个例外

也有值 true。但是,有两个例外:

  • 如果 d1 和 d2 都表示 Double.NaN,则 equals 方法返回 true,即使 Double.NaN==Double.NaN 的值为 false。

  • 如果 d1 表示 +0.0 而 d2 表示 -0.0,或者反之亦然,则相等测试的值为 false,即使 +0.0==-0.0 的值为 true。

此定义允许哈希表正常运行。

于 2012-09-24T06:07:24.443 回答
1

==如果变量是原始类型,则只能用于检查变量是否相等。对于对象变量,==用于比较对象的引用。如果要比较对象的值,请使用.equals()方法。

于 2012-09-24T06:09:15.930 回答
0

我不建议将盒装整数与 == 进行比较,因为它仅适用于某些值。

于 2012-09-24T06:25:58.377 回答