Javaで「==」と「equals」を正しく使用する方法は何ですか?

Javaでは、==とequalsは両方ともオブジェクトを比較するための方法ですが、それらは異なる目的と挙動を持っています。

  1. 演算子:
  2. 基本データ型の比較は、値が等しいかどうかです。
  3. 参照データ型では、比較されるのはオブジェクトの参照が同じかどうかであり、つまり同じメモリアドレスを指しているかどうかです。
  4. 例えば、
  5. int a = 5, b = 5;
    System.out.println(a == b); // 結果: trueString str1 = “hello”;
    String str2 = “hello”;
    String str3 = new String(“hello”);
    System.out.println(str1 == str2); // 結果: true
    System.out.println(str1 == str3); // 結果: false
  6. equals() メソッド:
  7. 基本データ型に対しては、equals() メソッドはオーバーライドされず、引き続き == で比較されます。
  8. デフォルトでは、参照データ型の場合、equals()メソッドと==は同じで、参照が等しいかどうかを比較します。
  9. 通常は、オブジェクトの比較ロジックをカスタマイズするために、equals() メソッドをオーバーライドする必要があります。equals() メソッドをオーバーライドする際には、以下の条件を満たす必要があります。- 反射性:どんな非nullの参照 x に対しても、x.equals(x) はtrueを返すべきです。
    – 対称性:どんな非nullの参照 x と y に対しても、x.equals(y) がtrueを返す場合、y.equals(x) もtrueを返すべきです。
    – 推移性:どんな非nullの参照 x、y、z に対しても、x.equals(y) がtrueかつ y.equals(z) がtrueの場合、x.equals(z) もtrueを返すべきです。
    – 一貫性:どんな非nullの参照 x、y に対しても、オブジェクトの情報が変更されていない場合、x.equals(y) を複数回呼び出しても同じ結果が返るべきです。
    – どんな非nullの参照 x に対しても、x.equals(null) はfalseを返すべきです。
  10. 例えば、
  11. public class Person {
    private String name;
    private int age;// Constructor and other methods omitted

    @Override
    public boolean equals(Object obj) {
    if (this == obj) {
    return true;
    }
    if (obj == null || getClass() != obj.getClass()) {
    return false;
    }
    Person person = (Person) obj;
    return age == person.age && Objects.equals(name, person.name);
    }
    }

    →Personクラスでは、名前と年齢を比較するequalsメソッドが定義されています。

  12. 利用例:
  13. Person person1 = new Person(“Alice”, 20);
    Person person2 = new Person(“Alice”, 20);
    Person person3 = new Person(“Bob”, 25);System.out.println(person1.equals(person2)); // 結果 true
    System.out.println(person1.equals(person3)); // 結果 false

まとめ:

  1. 基本データ型の値を比較するために使用され、また、参照データ型の参照が等しいかどうかを比較することもできます。
  2. equals()メソッドは、参照型データの値が等しいかどうかを比較するために使用されますが、具体的なビジネスロジックに基づいて再定義する必要があります。
bannerAds