迭代器
迭代器遍历集合步骤
1,通过集合获取迭代器 : list.iterator
2, while循环进行遍历迭代器,判断集合中是否有元素的 hasNext()
3,有元素就通过 next()方法获取出元素
迭代器只可以使用一次,如果需要在遍历一次,就需要在通过集合获取一次迭代器
增强for循环
目的: 简化迭代器
格式: for(元素类型 变量 : 单列集合或数组){}
增强for循环 本身就是迭代器,不能在遍历的过程中 增删元素
set集合
集合特点
无序: 元素存入和取出的顺序无法保证一致性
不重复: 重复的元素不会被存入
无索引: 集合中没有索引,无法通过索引操作元素
遍历只能迭代器,或者增强for循环
如果集合内容有重复的,不需要重复的数据,需要重写hashcode和equals 方法
HashSet集合
扩容特点
哈希数组的初始长度默认是16
当存储的元素 个数 超过 阈值 ,数组会进行扩容
阈值 = 数组长度 * 扩容因子
默认的扩容因子是0.75,也就是当元素个数到达 16 * 0.75 = 12 时,哈希表会进行扩容,每次扩容为原先的2倍
目的: 是为了降低哈希冲突,以便缩短链表的长度,提高元素的比较和查找的性能
特点
TreeSet是Set接口下的集合
元素无索引 不重复
TreeSet集合会自动 对元素进行排序
去重原理
添加元素时:
1, 调用hashCode方法,确定哈希表的位置
2,如果位置没有元素,直接添加,如果位置有元素.调用equals方法,比较是否一样
结论:
使用HashSet集合存元素时,要重写hashCode和equals方法
链表树化
jdk7
哈希表采用 数组+ 链表 实现
经常发生哈希冲突时,链表长度将会变得非常长, 一一比较是否相同时,势必会耗费大量时间降低性能
jdk8
哈希表优化为 数组 + 链表 + 红黑树实现
当某个链表元素超过8个,并且 数组长度 > = 64 时, 链表会转为红黑树进行存储
树化的目的和扩容的一样, 也是为了提高元素的比较和查找的性能
遍历方式
迭代器
white(itr.hasNext()){ itr.next();}
增强for循环
并发修改异常: 避免在迭代过程中,使用集合对象去增删元素
LikedHashSet(了解)
底层在哈希表的基础上,又维护了一个双向链表
LikedHashSet通过双向链表实现了 元素的存取有序性
TreeSet集合
底层结构
哈希表(数组+链表+红黑树)
排序规则
元素为数字时,默认按照升序排序(从小到大)
元素为字符串时,按照 字符的编码值升序排序
如果元素为自定义类型, 需要指定排序规则
自然排序
TreeSet集合可以对实现Comparable接口的元素自动排序
步骤:
元素类需要实现Comparable接口,重写 compareTo() 方法
使用无参构造方法创建 TreeSet集合,集合会对添加元素的实现排序
compareTo()方法排序原理
返回值为负数: 认为当前元素存入的元素较小值, 存左边
返回值为正数 : 认为当前元素存入的元素时较大值, 存右边
返回值为0,认为两个元素一样,不存入集合
TreeSet比较器排序
没有实现Comparable接口的元素,无法实现自动排序,此时可以在TreeSet的构造方法中传入Com parator比较器,实现排序
必须接收Com parator的实现类对象,并重写 compare(T o1 , T o2)方法
o1 : 表示要添加的元素, o2 : 表示集合中的元素
set集合总结
set接口下的元素都是无索引,不重复的
HashSet: 底层数据结构是 哈希表 查询快 ,增删快
LinkedHashSet : 继承了HashSet 集合, 元素存取顺序一致
TreeSet : 底层结构是红黑树,可以对元素进行排序
Collections
sort(List集合): 元素实现Comparable接口
sort(List集合,比较器)