Java equalsメソッドをオーバーライドするサンプル

Javaのequalsメソッドをオーバーライドするサンプルです。

目次

サンプル Objectクラスのequalsメソッドをオーバーライドなしで使用
  Objectクラスのequalsメソッドをオーバーライドありで使用
  (参考)Stringクラスのequalsメソッド

Objectクラスのequalsメソッドをオーバーライドなしで使用

Objectクラスのequalsメソッドをオーバーライドなしで使用するサンプルです。

package test1;

public class Test1 {
	public static void main(String[] args) {

		Color c1 = new Color("赤");
		Color c2 = new Color("赤");
		System.out.println(c1.name); // 赤
		System.out.println(c2.name); // 赤
		
		if (c1.equals(c2)) {
			System.out.println("OK");
		}else {
			System.out.println("NG"); // NG
		}
 	}
}
class Color {
	String name;
	Color(String a){
		this.name = a;
	}
}

6,7行目は、18~23行目のクラスのインスタンスを生成しています。
その際に、コンストラクタで同じ文字列をセットしています。
11行目は、equalsメソッドで比較しています。
このequalsメソッドは、Colorクラスの継承元のObjectクラスのequalsメソッドでの判定になりfalseになります。

falseになる理由

Objectクラスのequalsメソッドは、参照先が同じかどうか判定するためです。

    public boolean equals(Object obj) {
        return (this == obj);
    }

2行目は、==で参照先が同じか判定しています。

Objectクラスのequalsメソッドをオーバーライドありで使用

Objectクラスのequalsメソッドをオーバーライドありで使用するサンプルです。

package test1;

public class Test1 {
	public static void main(String[] args) {

		Color c1 = new Color("赤");
		Color c2 = new Color("赤");
		System.out.println(c1.name); // 赤
		System.out.println(c2.name); // 赤
		
		if (c1.equals(c2)) {
			System.out.println("OK"); // OK
		}else {
			System.out.println("NG");
		}
 	}
}
class Color {
	String name;
	Color(String a){
		this.name = a;
	}
	public boolean equals(Object obj1) {
		if (obj1 == this) return true;
	    if (obj1 instanceof Color) {
			Color b = (Color)obj1;
			if(this.name.equals(b.name)) {
				return true; // 実行される
			}
			return false;
		}
		return false;
	}
}

23行目は、Objectクラスのequalsメソッドをオーバーライドしています。
24行目は、C1オブジェクトとC2オブジェクトの参照先の比較でfalseになります。
25行目は、変数obj1が参照しているインスタンスは、Colorクラスのインスタンスであるか判定しています。trueになります。
27行目は、Stringクラスのequalsメソッドで文字列の値が等しいか判定しています。
11行目の判定は、trueになり、12行目の文字列が出力されます。

(参考)Stringクラスのequalsメソッド

以下は、Stringクラスのequalsメソッドです。文字列の値を比較するときに実行されます。
Objectクラスのequalsメソッドをオーバーライドしています。

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

13行目は、char型の配列で1文字ずつ比較しています。

※String str1 = "abc"とString str2 = "abc"で両者をequalsメソッドで比較した場合、String型の仕様で2行目の判定でtrueになります。
String str1 = new String("abc")とString str2 = new String("abc")で両者をequalsメソッドで比較した場合、2行目の判定はfalseになり5行目以降が実施されます。

注意点

equalsメソッドをオーバーライドする場合は、hashCodeメソッドもオーバーライドする必要があります。公式のequalsメソッドに記載があります。
(等価なオブジェクトは等価なハッシュ・コードを保持する必要がある)

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#equals-java.lang.Object-

Eclipseからhashcodeとequalsのコードを自動生成できます。
コードの箇所で右クリック→を「hashcodeおよびequalsの生成」クリックします。

関連の記事

Java instanceof インスタンスを調べる
Java クラスにtoStringメソッドを追加する意味

△上に戻る