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