Set集合
- 特点:无序、无下标、元素不可重复
- 方法:全部继承Collection中的方法
实现类:
HashSet
-
基于HashCode实现元素不重复
-
当存入元素的哈希码相同时,会调用equals进行确认,如果结果为true,则拒绝后者存入
-
基本方法:
- add
- remove
- contains
- size
重写hashCosd和equals方法可以让new出来的相同对象也无法加如集合中,真正的不可重复性
public static int hashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
//31是一个质数,减少散列冲突,让尽可能多的元素放在不同的位置
//31提高执行效率 31*i=(i<<5)-i
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}
TreeSet
- 基于排列顺序实现元素不重复
- 存储结构:红黑树,基于二叉查找树(一个结点最多有两个孩子,左孩子比父亲小,右孩子比父亲大)
- 实现了SortedSet接口,对集合元素自动排序
- 元素对象的类型必须实现Comparable接口,指定排序规则
- 通过CompareTo方法确定是否为重复元素
- 基本方法一样
添加多个数据时,由于TreeSet用的是红黑树结构,需要写一个比较规则
- 方法一:实现Comparable,实现CompareTo方法
- 方法二:常见集合时指定比较规则,用Comparator匿名内部类实现接口
//实现接口方法
@Override
public int compareTo(Person o) {
int n1 = this.getName().compareTo(o.getName());//名字相同返回0
int n2 = this.getAge()- o.getAge();//年龄相同返回0
return n1==0?n2:n1;//名字相同比年龄
}
}
================================================
//匿名内部类实现接口方法
TreeSet<Person> persons = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int n1 = o1.getName().compareTo(o2.getName());
int n2 = o1.getAge()- o2.getAge();
return n1==0?n2:n1;
}
});