Java - equalsとhashCodeをオーバーライドする方法

いくつかの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

参考文献

hashCode()について知っておくべき3つのこと 。 https://docs/

オブジェクトJavaDoc]。 Apache Commons Lang

: Overriding equals and hashCode in Java?]

リンク://タグ/ハッシュコード/[ハッシュコード]リンク://タグ/java/[java]