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