在实际开发中有时候会遇到须要比较同一个类的不一样实例对象的场景,通常状况下继承自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));
}
}