LoginSignup
0
0

More than 3 years have passed since last update.

equalsメソッドのオーバーライドの例

Last updated at Posted at 2021-04-14

idが一緒ならItemNameが違ってもtrueを返す

自分の定義したクラスを比較するときはequals()をオーバーライドをする
+ hashCode()もオーバーライドする
+ equals()とhashCode()はセットで扱う

①等価(equals)の判定
指している2つのものが「同じ内容」であること(同じアドレスを指していなくてもよい)
②等値(==)の判定
指しているものが「完全に同一の存在」であること(つまり同じアドレスを指していること)

equalsの場合は何をもって同じか判断するためにオーバーライドする

Item.java


public class Item {
    private int id ;
    private String  name;


    public Item(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    @Override
    public boolean equals(Object obj) {//なんでも入ってきていいようにObject型を
        if(obj == null) {return false;}
        //Itemがなければ
        //違う型だったら値を比べる話ではないので
        //もしも引数で受け取ったObjectクラスがItem型のインスタンスでなければfalse
        if(obj instanceof Item == false) {return false;}//この二つでnullでもなくItem型のインスタンスであることの補償となる
        //次はフィールドの値が一致するか/同じ値を持っているか
        //三通りありidだけ一致したらok/nameだけ一致したらok/id && nameが一致したらok
        //ここからはidが一致したら同じ商品だと言うことにする/自身にidとItem型にキャストしたobjの.id
        if(this.id == ((Item)obj ).id) {return true;}
        //条件に一致した時だけtrueを返したらいいからreturnはデフォルトはfalseにする
        return false;
        //親インスタンス部分のメソッドを呼び出す/親メソッドなのでこれではだめ
//      return super.equals(obj);
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}


Equals2.java

package yasasikunaiYouTube;

public class Equals2 {

    public static void main(String[] args) {
        Item a = new Item(100,"apple");
        Item b = new Item(100,"apples");

        System.out.println(a == b);
        System.out.println(a.equals(b));


    }

}
実行
false
true

hashCode()必要な理由

コレクションで色んなオブジェクトを扱っていくときにMapやSetやList色々比較検討をしたり,並び順を変えたりとか同じものがあらかじめ入っているかなどを検証したりやったりする.

Item.java


public class Item {
    private int id ;
    private String  name;


    public Item(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
//  @Override
//  public boolean equals(Object obj) {//なんでも入ってきていいようにObject型を
//      if(obj == null) {return false;}
//      //Itemがなければ
//      //違う型だったら値を比べる話ではないので
//      //もしも引数で受け取ったObjectクラスがItem型のインスタンスでなければfalse
//      if(obj instanceof Item == false) {return false;}//この二つでnullでもなくItem型のインスタンスであることの補償となる
//      //次はフィールドの値が一致するか/同じ値を持っているか
//      //三通りありidだけ一致したらok/nameだけ一致したらok/id && nameが一致したらok
//      //ここからはidが一致したら同じ商品だと言うことにする/自身にidとItem型にキャストしたobjの.id
//      if(this.id == ((Item)obj ).id) {return true;}
//      //条件に一致した時だけtrueを返したらいいからreturnはデフォルトはfalseにする
//      return false;
//      //親インスタンス部分のメソッドを呼び出す/親メソッドなのでこれではだめ
////        return super.equals(obj);
//  }


    public int getId() {
        return id;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Item other = (Item) obj;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }


    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}


Equals2.java

package yasasikunaiYouTube;

public class Equals2 {

    public static void main(String[] args) {
        Item a = new Item(100,"apple");
        Item b = new Item(100,"apple");

        System.out.println(a == b);
        System.out.println(a.equals(b));

        System.out.println(a.hashCode());
        System.out.println(b.hashCode());


    }

}

実行
false
true
93033271
93033271

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0