參考: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.
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.
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