java.util.Hashtable
提供的哈希表。
import java.util.*;
class BeanA {
private int i;
public BeanA(int i) {
this.i = i;
}
public String toString() {
return " " + i;
}
public boolean equals(Object o) {
BeanA a = (BeanA) o;
return (a.i == i) ? true : false;
}
public int hashCode() {
return i;
}
}
public class HashCodeTest {
public static void main(String[] args) {
HashSet<BeanA> set = new HashSet<BeanA>();
for (int i = 0; i <= 3; i++){
set.add(new BeanA(i));
}
System.out.println(set);
set.add(new BeanA(1));
System.out.println(set.toString());
System.out.println(set.contains(new BeanA(0)));
System.out.println(set.add(new BeanA(1)));
System.out.println(set.add(new BeanA(4)));
System.out.println(set);
}
}
我们在类BeanA中重写了equals和hashcode方法,这样在存储到HashSet数据集中,将保证不会出现重复的数据;如果把这两个方法去掉后,那些重复的数据仍会存入HashSet中,这就与HashSet强调的元素唯一性相违背,大家可以把这两个方法注释掉再运行一下。
因此,我们就可以理解在一些java类中什么情况下需要重写equals和hashcode。比如:在hibernate的实体类中,往往通过一个主键(或唯一标识符)来判断数据库的某一行,这就需要重写这两个方法。因为,Hibernate保证,仅在特定会话范围内,持久化标识(数据库的行)和Java标识是等价的。因此,一旦 我们混合了从不同会话中获取的实例,如果希望Set有明确的语义,就必 须实现equals() 和hashCode()。