4

重複の可能性:
Equalsと==の違い

たとえば、私が持っている場合

MyClass foo = new MyClass();
MyClass bar = new MyClass();

if (foo == bar) {
    // do something
}
if (foo < bar) {
    // do something
}
if (foo > bar) {
    // do something
}

どのようfoobar比較しますか?.compareTo()Javaは実装されるメソッドを探しますMyClassか?Javaは、オブジェクトの実際のバイナリ構造をメモリ内のビットごとに比較しますか?

4

5 に答える 5

8

非常に単純な算術比較演算子==であり!=、オブジェクト参照またはオブジェクトのメモリアドレスを比較します。><および関連する演算子はオブジェクトでは使用できません。

したがって==、は、2つの異なる変数が同じオブジェクト!=を指しているかどうかを判断する場合にのみ役立ちます。

例として、これはイベントハンドラーで役立ちます。たとえば、複数のボタンに関連付けられた1つのイベントハンドラーがある場合、どのボタンが押されたかをハンドラーで判別する必要があります。この場合、を使用できます==

質問しているタイプのオブジェクト比較は、のようなメソッド.equals、またはのような特別な目的のメソッドを使用してキャプチャされますString.compareTo

デフォルトのObject.equalsメソッドは次と同等であることに注意して==ください。オブジェクト参照を比較します。これについては、ドキュメントで説明されています。Javaに組み込まれているほとんどのクラスequalsは、独自の実装でオーバーライドします。たとえば、Stringオーバーライドequalsして文字を1つずつ比較します。独自のオブジェクトに対してより具体的で有用な実装を取得するには、より具体的な実装で.equalsオーバーライドする必要があります.equals

于 2012-10-05T22:33:48.957 に答える
4

、、、およびオブジェクトでは機能しないため<、自分>で試していないようです。<=>=

ただし、==左右のオペランドを比較します。それらが同じバイナリである場合、それは真になります。オブジェクトの場合、でポインタを比較します。つまり、これは、オブジェクトがメモリ内のまったく同じオブジェクトの左右にある場合にのみtrueになることを意味します。

compareToやequalsなどの他のメソッドは、メモリ内の異なるオブジェクトと比較するカスタムメソッドを提供するために作成されますが、これらは互いに等しい場合があります(つまり、データは同じです)。

文字列の場合、例:

String str0 = new String("foo");
String str1 = new String("foo");

// A human being would say that the two strings are equal, which is true
// But it are TWO different objects in memory. So, using == will result
// in false

System.out.println(str0 == str1); // false

// But if we want to check the content of the string, we can use the equals method,
// because that method compares character by character of the two objects

String.out.println(str0.equals(str1)); // true
String.out.println(str1.equals(str0)); // true
于 2012-10-05T22:36:21.860 に答える
2

いいえ、そうではありません。2つの変数が同じオブジェクトへの参照であるかどうかを比較します。

のように自動ボクシングの対象となるタイプを扱っている場合を除いて、オブジェクトをInteger使用することはできません。><

自動ボックス化された型を使用している場合、Javaは特定のメソッドを検索しませんが、変数のボックス化を自動的に解除してプリミティブに変換しますが、equals演算子の場合はそうではありません。自動ボックス化されたオブジェクトを比較する場合でも、==演算子は常にオブジェクトを参照として比較します。

    Integer i1 = new Integer(10);
    Integer i2 = new Integer(10);

    if(i1 < i2) { // evaluates to false!
        System.out.println("i1 is less than i2");
    }
    else if(i1 > i2) { // evaluates to false!
        System.out.println("i1 is greater than i2");
    }
    else if(i1 == i2) { // evaluates to false!
        System.out.println("i1 and i2 are equal");
    }
    else {
        System.out.println("Um... well that's just confusingi");
    }
于 2012-10-05T22:35:03.977 に答える
1

参照値を比較し、同じオブジェクトfoobar指している場合にのみtrueを返します。

于 2012-10-05T22:34:00.263 に答える
1

Javaでは、「==」はオブジェクトIDを比較します。「new」は、毎回新しいオブジェクトIDを返すことが保証されています。

"=="がcompareToを呼び出すとしたら、私は実際に気に入っています。残念ながら、そうではありません。

于 2012-10-05T22:35:11.563 に答える