在HashSet集合中存储自定义对象
将姓名和年龄相同的对象视为同一元素,并去除。
import java.util.HashSet;
import java.util.Iterator;public class Main
{
public static void main(String[] args)
{
HashSet hs=new HashSet();
hs.add(new person("lisi1",14));
hs.add(new person("lisi2",16));
hs.add(new person("lisi3",15));
hs.add(new person("lisi3",15));
/*
这样不能去除相同元素,因为存入元素到哈希表时,用哈希值计算出一个地址,然后存入表中对应地址位置。
在存入元素时,在通过此元素哈希值计算出地址,如果表中对应地址
已有元素,则再用此对象的equals比较地址上的元素是否是同一对象。
因为都是new出来的对象,哈希值不相同,所以需要确保名字年龄相同
的对象哈希值一样,并且复写equals方法
*/
Iterator it=hs.iterator();
while(it.hasNext())
{
person p=(person)it.next();
System.out.println(p.getName()+"....."+p.getAge());
}
}
}
class person
{
private String name;
private int age;
person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int hashCode()
{
return this.name.hashCode()+this.age;
/*通过判断条件,计算哈希值,不同年龄姓名对象计算的哈希值可能碰巧一样
所以需要复写equals,再比较年龄和姓名是否一样。
可以将年龄乘一个十位数,避免哈希值一样。但还是要覆写equals,不能只返回一个boolean
就了事,需要比较年龄和姓名,防止当哈希值一样时,存储元素出错。
*/
}
public boolean equals(Object o)
{
person p=(person)o;
return this.name.equals(p.getName()) && this.age==p.getAge();
}
}