文字が一致しているかどうか調べる時に、使えばいいのねくらいにしか思っていなかったequalsメソッドを掘り下げていきたいと思います。
equalsメソッドとは
Objectクラスのメソッドです。同値性の比較をしbooleanを返します。
同値性の確認はクラスによって異なるためオーバーライドして使用されることが多いです。
※ 同値 = 異なるインスタンスだが同じ値を持っている
構文
public boolean equals(Object obj)
ルール
- null以外の参照値xがあった時、x.equals(x)はtrueを返す
- null以外の参照値x、yについて、y.equals(x)がtrueを返す場合に限り、x.equals(y)はtrueを返す
- null以外の参照値x、y、zについて、x.equals(y)がtrueを返し、y.equals(z)がtrueを返す場合、x.equals(z)はtrueを返す
- null以外の参照値x、yについて、x.equals(y)の複数回呼出した時、比較で使われた情報が変更されていなければ、一貫してtrueを返すか、一貫してfalseを返す
- null以外の参照値xについて、x.equals(null)はfalseを返す
x == yがtrueの場合にだけtrueを返します。オーバーロードする際も上記ルールを守る必要があります。
サンプルコード
せっかくなのでequalsメソッドを使ってみたいと思います。
よく見るequalsメソッドの使われ方(文字列の比較)
public class Main {
public static void main(String[] args) {
String str = “test”;
Object obj = “test”;
System.out.println(str.equals(“test”));
System.out.println(str.equals(“hehe”));
System.out.println(str.equals(obj));
}
}
結果
true
false
true
equalsメソッドをオーバーライドしてみる
public class Sample {
int num;
Sample(int num){
this.num = num;
}
public boolean equals(Object obj){
if(obj == null){
return false;
}
if(obj instanceof Sample){
Sample sam = (Sample) obj;
return sam.num == this.num;
}
return false;
}
}
public class Main {
public static void main(String[] args) {
Sample s1 = new Sample(9);
Sample s2 = new Sample(10);
Sample s3 = new Sample(9);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
}
}
結果
false
true
おわり
x.equals(null)がfalseを返すことを知らなくてJavaSEの資格の勉強中何度間違えたことか。
あまりにも間違えたので今回記事にしてみました。参考になれば幸いです。