双列集合 迭代器 Collectios

迭代器

迭代器遍历集合步骤

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集合,比较器)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值