如何重寫hashcode和equals方法

參考:http://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/

翻譯:http://blog.csdn.net/zzg1229059735/article/details/51498310

我覺得看原文就很好了, 不過還是粘貼出來。

1. POJO

Some Java examples to show you how to override equals and hashCode.

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.  實現

實現1. Classic Way(經典方法)

The 17 and 31 hash code idea is from the classic Java book – effective Java : item 9
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

For JDK 7 and above, you can use the new Objects class to generate the equals and hash code values.

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

Alternatively, you can use the Apache Commons Lang EqualsBuilder andHashCodeBuilder function.

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();
    }

}

3. Test again

After overrides both equals and hashCode.

User user1 = new User("mkyong", 35, "111222333");
User user2 = new User("mkyong", 35, "111222333");

System.out.println(user1.equals(user2)); // true


4.hashcode()和equals()的作用、區別、聯繫

參考: https://www.cnblogs.com/keyi/p/7119825.html

5. hashset 添加自定義對象時,重寫hashcode和equals方法

參考:https://jingyan.baidu.com/article/d5a880eb8fb61d13f147cc99.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章