—————————————————————
——————————————
Set集合的方法和Collection框架的方法完全相同。
Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。
········常用子类:
···············TreeSet :底层数据结构是二叉树(又称为红黑树)
················HashSet:底层数据结构是哈希表
······注:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。下面接着拿上次的案例继续详述:
定义Person类:
class Person
{
private String name;
private int age;
//假设函数一初始化就指定姓名和年龄
Person(String name,int age)
{
this.name = name;
this.age = age;
}
//这里只写了get方法,用于获取。开发一般get和set都写
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int hashCode()
{
//字符串的hashCode()方法加上年龄乘以一个比较大的数,防止出现40+30=30+40的情况。
return this.name.hashCode()+this.age*17;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p=(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;//这句话里的equals是字符串(String类)的equals方法
}
}
主函数类:
class HashSetDemo
{
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new Person("zhangsan01",20));
hs.add(new Person("lishi01",21));
hs.add(new Person("zhangsan01",22));
hs.add(new Person("lishi01",21));
//是否包含
System.out.println(hs.contains(new Person("lishi01",21)));
//移除
hs.remove(new Person("zhangsan01",22));
Iterator it=hs.iterator();
while(it.hasNext())
{
Person p=(Person)it.next()
System.out.println(p.name+"......"+p.age);
}
}
}
结论:
①HashSet是如何保证元素的唯一性的呢?
······答:通过元素的两个方法:hashCode和equals来完成。只有元素的HashCode值相同的情况下才会判断equals()是否也相同。否则,只判断元素的HashCode值是否相同。
·····②但凡涉及到使用Set集合,一般都需要重写 HashCode() 和 equals()方法,否则容易出错!
····③涉及到List集合时,一般也需要重写equals()方法。