import java.util.*;
/*HashSet集合是如何保证元素唯一性的呢?
 HashSet集合保证元素唯一性,依靠的是元素的HashCode方法和equals方法
 当元素的哈希值不同时,元素都有自己的独立位置,不需要判断equals方法
 当元素的哈希值相同时,元素在哈希表中的位置相同,这时就需要判断一次元素的内容是否相同,
 这时就需要调用元素的equals方法,如果equals方法返回true,就将两个元素视为重复元素,只存储一个
 如果equals方法返回false,则这是两个不同元素,存储在同一个哈希值上
 为了建立判断自定义对象是否是重复的元素,最好复写hashcode方法和equals方法,而且最好依据对象的特有条件来建立HashCode和
 equals方法的实现。*/
public class HashSetDemo2 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //往HashSet集合中存储自定义对象
  HashSet hs=new HashSet();
  hs.add(new Person("lisi1",20));
  hs.add(new Person("lisi4",21));
  hs.add(new Person("lisi6",29));
  hs.add(new Person("lisi9",23));
  hs.add(new Person("lisi1",20));
  System.out.println("------------------------");
  Iterator it=hs.iterator();
  while(it.hasNext())
  {
   Person p=(Person)it.next();
   System.out.println(p.getName()+"......"+p.getAge()+"......"+p.hashCode());
  }
  /**/
 }

}

//人对象,如果姓名和年龄相同就视为同一对象,就不再进行存储
class Person
{
 String name;
 int age;
 Person(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
 public int hashCode()
 {
  //System.out.println(this+".....hashCode");
  final int NUMBER=39;
  return name.hashCode()+age*NUMBER;
 }/**/
 public boolean equals(Object obj)
 {
  //System.out.println(this+"....equals...."+obj);
  if(this==obj)
   return true;
  if(!(obj instanceof Person))
   return false;
  Person p=(Person)obj;
  return this.name.equals(p.name) && this.age==p.age;
 }
 public String getName()
 {
  return name;
 }
 public int getAge()
 {
  return age;
 }
 public String toString()
 {
  return name+"::"+age;
 }
 
}
 
output:

------------------------
lisi9......23......102983047
lisi6......29......102983278
lisi1......20......102982922
lisi4......21......102982964