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の生成」クリックします。
関連の記事