java equals()和hashCode()重寫總結

在實際開發中有時候會遇到需要比較同一個類的不同實例對象的場景,一般情況下繼承自Object父類的equals()和hashCode()可以滿足需求,但卻不能滿足所有的場景,比如只需要使用少數幾個對象屬性來判斷比較是否是同一個對象,這時我們就需要自定義的equals()和hashCode()實現來進行重寫覆蓋Object中的方法。

1. equals()方法重寫注意事項
a. 自反性:對於任意的引用值x,x.equals(x)一定爲true。
b. 對稱性:對於任意的引用值x 和 y,當x.equals(y)返回true時, y.equals(x)也一定返回true。
c. 傳遞性:對於任意的引用值x、y和z,如果x.equals(y)返回true,
  並且y.equals(z)也返回true,那麼x.equals(z)也一定返回true。
d. 一致性:對於任意的引用值x 和 y,如果用於equals比較的對象信息沒有被修
  改,多次調用x.equals(y)要麼一致地返回true,要麼一致地返回false。
e. 非空性:對於任意的非空引用值x,x.equals(null)一定返回false。

2. 重寫equals()方法的同時一定要重寫hashcode()方法
hashcode是用於散列數據的快速存取,如利用HashSet/HashMap/Hashtable類來存儲數據時,都是根據存儲對象的hashcode值來進行判斷是否相同的。
如果重寫equals()的時候沒有重寫hashcode()方法,就會造成對象之間的混淆。
equals()和hashcode()方法之間要滿足一下關係:
(1)當obj1.equals(obj2)爲true時,obj1.hashCode() == obj2.hashCode()必須爲true
(2)當obj1.hashCode() == obj2.hashCode()爲false時,obj1.equals(obj2)必須爲false
3. 示例代碼

package com.vdlm.dal.model;

public class UserViewScore {

    private Integer totalScore;

    private String  taskContentId;

    private String  userId;

    private String  type;


    public String getTaskContentId() {
        return taskContentId;
    }

    public void setTaskContentId(String taskContentId) {
        this.taskContentId = taskContentId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }    

    public boolean equals(Object object) {

        if (this == object) {
            return true;
        }
        if (object == null) {
            return false;
        }
        if (getClass() != object.getClass()) {
            return false;
        }
        UserViewScore userViewScore = (UserViewScore)object;
        if (userViewScore.getUserId() == null || userViewScore.getTaskContentId()== null) {
            return false;
        }
        return userId.equals(userViewScore.getUserId()) && taskContentId.equals(userViewScore.getTaskContentId());
    }


     public int hashCode(){
         int result = userId.hashCode()+taskContentId.hashCode();
         return result;
     }

    public Integer getTotalScore() {
        return totalScore;
    }

    public void setTotalScore(Integer totalScore) {
        this.totalScore = totalScore;
    }
}

單元測試:

public class UserViewScoreTest {

    @Test
    public void test() {
        UserViewScore  user1 = new UserViewScore();
        user1.setUserId("111");
        user1.setTaskContentId("123");

        UserViewScore  user2 = new UserViewScore();
        user2.setUserId("111");
        user2.setTaskContentId("123");

        UserViewScore  user3 = new UserViewScore();
        user3.setUserId("111");
        user3.setTaskContentId("123");

//驗證重寫equals的對稱性
System.out.println("user1.equals(user2):"+user1.equals(user2));
System.out.println("user2.equals(user1):"+user2.equals(user1));
//驗證重寫equals的傳遞性
System.out.println("user1.equals(user2):"+user1.equals(user2));
System.out.println("user2.equals(user3):"+user2.equals(user3));
System.out.println("user1.equals(user3):"+user1.equals(user3));
//驗證重寫equals的自反性
System.out.println("user1.equals(user1):"+user1.equals(user1));
//驗證重寫equals的非空性
System.out.println("user1.equals(null):"+user1.equals(null));
  }
}

這裏寫圖片描述

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