在實際開發中有時候會遇到須要比較同一個類的不一樣實例對象的場景,通常狀況下繼承自Object父類的 equals()和hashCode()能夠知足需求,但卻不能知足全部的場景,好比只須要使用少數幾個對象屬性來判斷 比較是不是同一個對象,這時咱們就須要自定義的equals()和hashCode()實現來進行重寫覆蓋Object中的方 法。html
1. equals()方法重寫注意事項java
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,this
而且y.equals(z)也返回true,那麼x.equals(z)也必定返回true。code
d. 一致性:對於任意的引用值x 和 y,若是用於equals比較的對象信息沒有被修htm
改,屢次調用x.equals(y)要麼一致地返回true,要麼一致地返回false。對象
e. 非空性:對於任意的非空引用值x,x.equals(null)必定返回false。繼承
2. 廣州java課程重寫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));
}
}