HashSet存储的元素不能重复,判断两个元素是否是同一个元素是比较两者的HashCode,每个对象都有自己的HashCode。在程序中可以覆盖对象的int hashCode()方法。
class Person{
public String name;
public int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public int hashCode(){
return age;
}
}
class reflectdemo{
public static void main(String[] args){
Person p1=new Person("p1",21);
Person p2=new Person("p2",22);
Person p3=new Person("p3",23);
Person p4=new Person("p4",24);
HashSet<Person> hs=new HashSet<Person>();
hs.add(p1);
hs.add(p2);
hs.add(p3);
hs.add(p4);
System.out.println(hs.size());
p4.age=25;
System.out.println(hs.remove(p4));
System.out.println(hs.size());
}
}
上面的代码中,将Person类的hasCode()方法覆盖,用age值作为对象的HashCode值,在往hs中添加对象时,因为每个Person对象的age都不一样,HashCode也不一样,所以都能添加进来,hs.size()=4。当p4修改了字段age值,它的HashCode值也随之改变,当调用hs.remove(p4)时,将比较hs中每个元素的HashCode值,结果没有HashCode值是25的元素,删除失败,p4仍然在容器中。如果程序中反复修改对象字段值,并添加到容器中,容器比较HashCode值后都会接收,造成内存泄露。 |
|