Collection
引言
所有集合都是由Collection和Map派生
Collection是List和Set的父接口
Collection没有自己的直属实现类
Collection没有明确的存储特点
Set的存储特点
无序、无下标、元素不可重复
常用实现类
HashSet:出自JDK1.2;底层哈希表(数组+链表)实现 线程不安全,效率高
LinkedHashSet:出自JDK1.2;底层哈希表实现,线程不安全,效率高
TreeSet:出自JDK1.2;是SortedSet的实现类,底层红黑树实现,线程不安全,效率高
常用方法:
所有方法都继承自父接口Collection,没有独有方法
创建方式建议使用多态
遍历(三种)
迭代器遍历、外遍历、自遍历
迭代器遍历步骤
获取迭代器
Iterator<Integer>it = set.iterator();
遍历迭代器
while(it.hasNext()){
System.out.print(it.next()+"");
}
外遍历
for(Integer i:set){
System.out.print(i+"");
}
System.out.println();
自遍历
set forEach(new Consumer<Integer>(){
public void accept(Integer i){
System.out.print(i+"");
}
});
lambda简化
set.forEach(i->System.out.prin(i+""));
哈希表的去重过程
第一步:调用元素的hashCode()方法获取哈希码值
第二步:通过哈希码值对数组长度(16)取余得到存放下标
第三步:判断下标是否存有元素,如果未存放则直接存放
第四步:如果下标存有元素,则调用其equals()方法与下标位置的元素依次进行值的比较
第五步:判断值是否相同,若都不相同,在下标位置上,继续链表存放,如果相同,则舍弃添加该元素
使用要求
HashSet和LinkedHashSet存放自定义类型时,必须重写hashCode和equals方法才能实现去重
LinkedHashSet可以保证元素存入和取出的顺序一致(原因是存入元素时会给他一个标记)
红黑树采用二分查找法,特点是查询效率快
TreeSet可以实现对元素进行默认的升序排序
当存放自定义类型时,或想要降序排列时,都需要自定义排序规则
实现Comparable接口,重写compareTo方法
实现:想对谁排序就让谁实现
原理:让当前对象this的值和参数对象o的值进行比较
规则:从小到大:this的值大返回正数,值小返回负数
从大到小:this的值大返回负数,值小返回正数
相等返回0
实现Compartor接口,重写compare方法
实现:在集合创建处的小括号内传入比较器实现类对象
原理:让参数o1和o2的值进行比较
相较于两种方式,更推荐使用比较器自定义排序规则
Comparable 排序接口会破坏类的单一职责,而且无法任意更改排序规则
Comparator比较接口不会破坏类的单一职责,并且可以使每个集合自定义自己的规则
默认识别Comparable,但是Comparator优先级更高
TreeSet是在排序规则返回0时去重
需要重写以HashSet优先,排序时使用TreeSet