Udemyの人気コースが今なら80%OFF!

【Java入門】等価と等値の違い

【Java入門】等価と等値

等価とは

等価は英語で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と判定されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です