1、当向集合中添加对象时,首先计算要增加对象的hashCode码,根据该值得到一个位置用来存放当前的对象,当该位置没有一个对象存在的话,直接将该对象增加进去。如果该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置的对象进行equals方法比较,如果返回false,那么集合认为集合中不存在该对象,再进行一次散列,将该对象放到散列后计算出的新地址里。如果equals方法返回true,那么集合认为已经存在该对象,不会再让该对象增加到集合中。
2、当重写equals方法时必须重写hashCode方法。如果一个类的两个对象使用equals方法比较时结果为true,那么这两个对象一定具有相同的hashCode。相反,hashCode相同,不一定equals
import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class Test { public static void main(String[] args) { Set<Person> set = new HashSet<Person>(); set.add(new Person("zhangsan")); set.add(new Person("lisi")); set.add(new Person("zhangsan")); for (Iterator<Person> iter = set.iterator(); iter.hasNext();) { System.out.println(iter.next().getName()); } } } class Person { String name; public Person(String name) { this.name = name; } public String getName() { return this.name; } // 重写hashCode()方法 @Override public int hashCode() { return this.name.hashCode(); } // 重写equals() 方法 @Override public boolean equals(Object obj) { if (obj == null) return false; // 同一个对象直接返回true if (obj == this) return true; if (obj instanceof Person) { Person p = (Person) obj; if (p.name.equals(this.name)) return true; } return false; } }