您的位置:首页 > 其它

如何重写hashcode和equals方法

2018-01-27 15:27 387 查看
参考: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
and
HashCodeBuilder
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: