HashSet特点
●基于HashCode计算元素存放位置。
●当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。
存储结构:哈希表(数组+链表十红黑树)
存储过程(重复依据):
(1)根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
(2)再执行equals方法,如果equals 方法为true.则认为是重复,否则,形成链表。
添加元素
HashSet<Person> person=new HashSet();
//添加元素
Person p1=new Person("刘德华",22);
Person p2=new Person("周润发",24);
Person p3=new Person("梁朝伟",23);
Person p4=new Person("林志玲",20);
person.add(p1);
person.add(p2);
person.add(p3);
person.add(p4);
//重写equals方法和hashcode方法使得相同名字和年龄的对象不能重复添加
person.add(new Person("梁朝伟",23));//无效添加,equals判断后与p3重复
System.out.println("集合中的元素为:"+person.size());
System.out.println(person.toString());
删除元素
//删除元素
//判断是否重复的依据是hashcode和equals方法
person.remove(new Person("周润发",24));
System.out.println("删除后元素个数:"+person.size());
System.out.println(person.toString());
遍历集合元素
//遍历集合元素
//增强for循环
for (Person person1 : person) {
System.out.println(person1);
}
//迭代器
Iterator it=person.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
判断
//判断是否重复的依据是hashcode和equals方法
System.out.println(person.contains(new Person("刘德华",22)));
System.out.println(person.isEmpty());
此文中所用到的重写方法
@Override
public boolean equals(Object o) {
if (this == o) //1.判断是否为同一个元素
return true;
if(o==null){//2.判断是否为空
return false;
}
//3.判断是否为Person类型
if(o instanceof Person){
Person p=(Person) o;
//4.比较属性
if(this.name.equals(p.getName())&&this.age==p.getAge()){
return true;
}
}
//5.不满足条件则返回false
return false;
}
@Override
public int hashCode() {
int n1=this.name.hashCode();
int n2=this.age;
return n1+n2;
}