いくつかのJavaの例は、
equals`と
hashCode`をオーバーライドする方法を示しています。
1. POJO
2つのJavaオブジェクトを比較するには、equalsとhashCodeの両方をオーバーライドする必要があります(Good Practice)。
User.java
public class User {
private String name;
private int age;
private String passport;
//getters and setters, constructor
}
User user1 = new User("mkyong", 35, "111222333");
User user2 = new User("mkyong", 35, "111222333");
System.out.println(user1.equals(user2));//false
2.クラシックウェイ
17と31のハッシュコードのアイデアは、古典的なJavaブックの有効なJavaからです:item 9
User.java
public class User {
private String name;
private int age;
private String passport;
//getters and setters, constructor
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof User)) {
return false;
}
User user = (User) o;
return user.name.equals(name) &&
user.age == age &&
user.passport.equals(passport);
}
//Idea from effective Java : Item 9
@Override
public int hashCode() {
int result = 17;
result = 31 ** result + name.hashCode();
result = 31 ** result + age;
result = 31 ** result + passport.hashCode();
return result;
}
}
2. JDK 7
JDK 7以上では、新しい `Objects`クラスを使用して、等価値とハッシュコード値を生成することができます。
User.java
import java.util.Objects;
public class User {
private String name;
private int age;
private String passport;
//getters and setters, constructor
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof User)) {
return false;
}
User user = (User) o;
return age == user.age &&
Objects.equals(name, user.name) &&
Objects.equals(passport, user.passport);
}
@Override
public int hashCode() {
return Objects.hash(name, age, passport);
}
}
3. Apache Commons Lang
あるいは、Apache Commons Lang
EqualsBuilder`と
HashCodeBuilder`関数を使用することもできます。
User.java
import org.apache.commons.lang3.builder;
public class User {
private String name;
private int age;
private String passport;
//getters and setters, constructor
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof User)) {
return false;
}
User user = (User) o;
return new EqualsBuilder()
.append(age, user.age)
.append(name, user.name)
.append(passport, user.passport)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(name)
.append(age)
.append(passport)
.toHashCode();
}
}
4.再度テストする
後は
equals`と
hashCode`の両方をオーバーライドします。
User user1 = new User("mkyong", 35, "111222333");
User user2 = new User("mkyong", 35, "111222333");
System.out.println(user1.equals(user2));//true
参考文献
-
https://en.wikipedia.org/wiki/Java__hashCode(
)[Wikipedia:Java
hashCode()について知っておくべき3つのこと
。
https://docs/
オブジェクトJavaDoc]。
Apache Commons Lang
JavaDoc]。
http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java
[Stackoverflow
: Overriding equals and hashCode in Java?]
リンク://タグ/ハッシュコード/[ハッシュコード]リンク://タグ/java/[java]