0.背景
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。
1. 使用
hashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。
默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。
2. JDK的Javadoc中所说,如果重写equals()方法必须要重写hashCode()方法
尽量保证使用对象的同一个属性来生成hashCode()和equals()两个方法。
Apache Commons 包提供了两个非常优秀的类来生成hashCode()和equals()方法:
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Employee
{
private Integer id;
private String firstname;
private String lastName;
private String department;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
@Override
public int hashCode()
{
final int PRIME = 31;
return new HashCodeBuilder(getId()%2==0?getId()+1:getId(), PRIME).
toHashCode();
}
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if (o == this)
return true;
if (o.getClass() != getClass())
return false;
Employee e = (Employee) o;
return new EqualsBuilder().
append(getId(), e.getId()).
isEquals();
}
}
3.注意的问题:
- 尽量保证使用对象的同一个属性来生成hashCode()和equals()两个方法。
- eqauls方法必须保证一致(如果对象没有被修改,equals应该返回相同的值)任何时候只要a.equals(b),那么a.hashCode()必须和b.hashCode()相等。
- 两者必须同时重写。