10

私はJavaの初心者なので、次の例に混乱しています。「==」記号は、整数と int からの「自動ボックス化された」整数との間の値を比較し、整数間の参照アドレスを比較すると考えてもよろしいですか?

double と 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 までの値のオートボクシングのオブジェクト ID セマンティクスをサポートするキャッシュ内。 ソースコードを見る

そう:

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

Autoboxing と Unboxingのチュートリアルは次のとおりです。

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) は false になります。

  • いずれかのオペランドが NaN (§15.21.1) の場合、不等演算子 != は true を返します。

  • 特に、x!=x は、x が NaN である場合にのみ真になります。

Double#equalsメソッドをチェックすると、2 つの例外があります

値も true です。ただし、次の 2 つの例外があります。

  • d1 と d2 の両方が Double.NaN を表す場合、Double.NaN==Double.NaN の値が false であっても、equals メソッドは true を返します。

  • d1 が +0.0 を表し、d2 が -0.0 を表す場合、またはその逆の場合、+0.0==-0.0 の値が true であっても、等しいテストの値は false になります。

この定義により、ハッシュ テーブルが適切に動作します。

于 2012-09-24T06:07:24.443 に答える
1

==変数がプリミティブ型である場合、変数が等しいかどうかをチェックするためにのみ使用できます。オブジェクト変数の場合、==オブジェクトの参照を比較するために使用されます。オブジェクトの値を比較する場合は、.equals()メソッドを使用します。

于 2012-09-24T06:09:15.930 に答える
0

ボックス化されたintを==と比較することはお勧めしません。これは、一部の値に対してのみ機能するためです。

于 2012-09-24T06:25:58.377 に答える