等価とは
等価は英語でequivalentといいます。
Javaではequals
メソッドを用いてobj.equals(obj2)
と記述します。
このとき、2つのオブジェクトの内容が同じであればtrue,異なればfalseとなります。
2つのオブジェクトが同じインスタンスを指していなくても、内容的に同じであればtrueとなります。
しかしながら、何を以って”同じ”とするかは開発者の判断に委ねられています。
そのため、開発者はequals
メソッドをオーバーライドして等価とみなして良い条件を記述する必要があります。
equalsメソッドをオーバーライドする
以下のようにオーバーライドします。
Java
public class Person {
String name; //名前
int age; //年齢
String birthplace; //出身地
//コンストラクタ
public Person(String name, int age, String birthplace) {
this.name = name;
this.age = age;
this.birthplace = birthplace;
}
//ゲッターセッター
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
public String getBirthplace() {return birthplace;}
public void setBirthplace(String birthplace) {this.birthplace = birthplace;}
@Override
public String toString(){
return name + "," + age + "," + birthplace;
}
@Override
public boolean equals(Object o){
//渡されたオブジェクトがnullの場合は、falseを返す。
if(o == null) return false;
//渡されたオブジェクトが継承関係に無ければ、falseを返す。
if(!(o instanceof Person))return false;
//渡されたオブジェクトが自分と同じインスタンスの場合は、trueを返す。
if(this == o) return true;
Person p = (Person) o;
//名前が同一であればtrueを返す。
if(this.name.equals(p.name))return true;
//ここまで到達すればfalseを返す。
return false;
}
}
解説
28行目~46行目でequalsメソッドをオーバーライドしています。
等価判定を行う
では、オブジェクトを生成して実際に比較してみます。
Java
//Personクラスのオブジェクトを生成。
Person p1 = new Person("Trump", 72 , "USA");//ドナルド・トランプ大統領
Person p2 = new Person("Trump", 65 , "Japan");//ドナルド・トランプ大統領
Person p3 = new Person("Sinzo", 65 , "Japan");//安倍晋三首相
//Personクラスのオブジェクトp1とp2を比較する。
System.out.println("p1とp2を比較:" + p1.equals(p2));
//Personクラスのオブジェクトp1とp2を比較する。
System.out.println("p1とp3を比較:" + p1.equals(p3));
実行結果
p1とp2を比較:true
p1とp3を比較:false
解説
p1とp2はname=”Trump”で同一なのでこの2つのオブジェクトはtrueと判定されます。
一方、p1とp3を比較した場合は、nameが一致しないのでfalseと判定されます。
等値とは
等値は英語でequalityといいます。
Javaでは==
演算子を用いてobj1==obj2
と記述します。
このとき、2つのオブジェクトが同じインスタンスを指していればtrue,異なるインスタンスであればfalseになります。
(内容的に同じ値が入っていたとしてもインスタンスが異なればfalseとなります。)
等値判定を行う
では、オブジェクトを生成して実際に比較してみます。
Java
//Personクラスのオブジェクトを生成。
Person p1 = new Person("Trump", 72 , "USA");//ドナルド・トランプ大統領
Person p2 = new Person("Trump", 72 , "USA");//ドナルド・トランプ大統領
Person p3 = p1;
//Personクラスのオブジェクトp1とp2を比較する。
System.out.println(p1 == p2);
//Personクラスのオブジェクトp1とp3を比較する。
System.out.println(p1 == p3);
実行結果
false
true
解説
p1とp2は各フィールドの内容は同じですがインスタンスが異なるので、falseと判定されます。
一方、p3はp1のインスタンスを代入しているので、インスタンスが等しいためtrueと判定されます。
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!