25

私はそれDoubleがラッパークラスであることを知っています、そしてそれはdouble数をラップします。今日、私は別の主な違いを見てきました:

double a = 1.0;
double b = 1.0;
Double c = 1.0;
Double d = 1.0;
System.out.println(a == b);  // true
System.out.println(c == d);  // false

私にはとても奇妙です!!!

したがって、を使用する場合はDouble、毎回、次のようなことを行う必要があります。

private static final double delta = 0.0001;
System.out.println(Math.abs(c-d) < delta); 

Doubleが直接比較を間違える理由を説明することはできません。説明してください。

4

5 に答える 5

33

cdは技術的には2つの異なるオブジェクトであり、==演算子は参照のみを比較します。

c.equals(d)

参照ではなく値を比較するため、より優れています。しかし、それでも理想的ではありません。浮動小数点値を直接比較するには、常に何らかのエラー(イプシロン)を考慮に入れる必要があります(Math.abs(c - d) < epsilon)。

ご了承ください:

Integer c = 1;
Integer d = 1;

ここで比較するとが得られますtrueが、それはもっと複雑です(Integer内部キャッシュ、JavaDocでInteger.valueOf()説明されています):

このメソッドは、常に-128〜127の範囲の値をキャッシュし、この範囲外の他の値をキャッシュする場合があります。

なぜvalueOf()ですか?このメソッドは、自動ボクシングを実装するために暗黙的に使用されるため、次のようになります。

Integer c = Integer.valueOf(1);
Integer d = Integer.valueOf(1);

も参照してください

于 2012-09-01T10:00:04.717 に答える
6

クラス型の式に適用すると、==常に参照比較が実行されます(JLSセクション15.21.3)。したがって、この行:

System.out.println(c == d); 

同じオブジェクトcを参照しているかどうかを確認しています。dJavaでの自動ボクシングは常に(私は信じています)との新しいオブジェクトを作成しますfloat(整数型1doubleの場合は状況がより複雑になります)。したがって、さまざまなオブジェクトを参照すると、が出力されます。cdfalse

オブジェクトが等しいかどうかを比較する場合は、equals明示的に呼び出す必要があります。

System.out.println(c.equals(d));

を使用doubleすると、代わりに数値の等式が使用されます-セクション15.21.1で指定されています。したがって、行動の違い。


1統合オートボクシングの場合、「小さい」値がキャッシュされます。したがって、オートボクシング5(たとえば)は毎回同じ参照を返します。「小さい」の定義は実装固有ですが、-128から127の範囲内で保証されています。詳細については、セクション5.1.7の下部を参照してください。

于 2012-09-01T10:02:09.813 に答える
3

equals()2つのオブジェクトの同等性をチェックするために使用します。==2つの参照がメモリ内の同じオブジェクトを参照しているかどうかを確認します。

于 2012-09-01T10:00:48.820 に答える
2

==コンテンツチェックは、プリミティブ型をチェックする場合にのみ信頼できます。オブジェクトタイプの場合は、常に次のequalsメソッドを使用することをお勧めします。

c.equals(d)
于 2012-09-01T10:02:30.410 に答える
1

==との違いequals

プリミティブデータ型での使用==は、オブジェクト参照データ型での使用と同じではありません。

  1. プリミティブデータ型==では、として使用されequalsます。
  2. オブジェクト参照の場合、データ型==はそれらの参照を参照します。したがって、オブジェクトがメモリ内で指しているもの。

ケース1を考えてみましょう

    double d1 = 10.00;
    double d2 =10.00;
    System.out.println(d1 == d2); 

*出力は* true

ここに画像の説明を入力してください

ケース2:==参照データ型

    Double d1 = 10.00;
    Double d2 =10.00;
    System.out.println(d1 == d2);

*出力は*false

ここに画像の説明を入力してください

d1とd2のメモリ参照は異なります。

これの有効性を確認するには、次のコードを検討してください

    Double d1 = 10.00;
    Double d2 = d1;
    System.out.println(d1 == d2);

trued1とd2が同じメモリ参照を指しているため、これは出力されます。

したがって

Javaプリミティブ==を比較し、2つの変数が同じオブジェクトを参照しているかどうかを確認するために使用します

「等しい」

objects2つが同等かどうかを確認するために使用されます。

また、呼び出されているオブジェクトの実装にも依存します。についてStringsは、equals()その中の文字をチェックします。

    Double d1 = 10.00;
    Double d2 = 10.00;
    System.out.println(d1.equals(d2));

trued1とd2の内部にあるように見えるので印刷 します。

ケース1はコンパイルされません

ここに画像の説明を入力してください

于 2020-01-30T14:49:51.513 に答える