Set集合
概述:元素是无序(存储顺序和取出顺序不一致),元素是唯一的,不可重复的
增强for:是for循环的一种。
格式:
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
注意:
好处:简化了数组和集合的遍历。
弊端: 增强for的目标不能为null。
对增强for的目标先进行不为null的判断,然后在使用。
HashSet类
HashSet类概述
不保证 set 的迭代顺序、 特别是它不保证该顺序恒久不变。
HashSet如何保证元素唯一性 ?
底层数据结构是哈希表(元素是链表的数组)
哈希表依赖于哈希值存储
添加功能底层依赖两个方法:
int hashCode()
boolean equals(Object obj)
我们可以查看add方法的源码,就可以知道这个方法底层依赖 两个方法:hashCode()和equals()。
步骤:
首先比较哈希值
如果相同,继续走,比较地址值或者走equals()
如果不同,就直接添加到集合中
按照方法的步骤来说:
先看hashCode()值是否相同 ?
相同:继续走equals()方法
返回true: 说明元素重复,就不添加
返回false:说明元素不重复,就添加到集合
不同:就直接把元素添加到集合
如果类没有重写这两个方法,默认使用的Object()。一般来说不同相同。
而String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。
LinkedHashSet类
概述
- 底层数据结构由哈希表和链表组成
- 由链表保证元素有序(存储和取出是一致)
- 由哈希表保证元素唯一性
TreeSet类
概述
- 使用元素的自然顺序对元素进行排序
- 或者根据创建 set 时提供的 Comparator 进行排序
所以排序有两种方式
- 自然排序
- 比较器排序
- 具体取决于使用的构造方法。
TreeSet是如何保证元素的排序和唯一性的 ?
底层数据结构是红黑树(红黑树是一种自平衡的二叉树)
下面我们就来学习一下二叉树
二叉树
我们先来了解元素是如何存储进去的?
第一个元素存储的时候,直接作为根节点存储。
从第二个元素开始,每个元素从根节点开始比较
比根节点元素大,就放在右边
比根节点元素小,就放在左边
相等的话就忽略。
我们以上面的存储的元素20,18,23,22,17,24,19,18,24来画一个图帮助大家理解
这里写图片描述
元素是如何取出来的呢?
从根节点开始,按照左、中、右的原则依次取出元素即可。
Comparator 排序
上面我们学习了自然排序,接下来我们来学习比较器排序。
TreeSet集合保证元素排序和唯一性的原理
唯一性:是根据比较的返回是否是0来决定。
排序:
A:自然排序(元素具备比较性)
让元素所属的类实现自然排序接口 Comparable
B:比较器排序(集合具备比较性)
让集合的构造方法接收一个比较器接口的子类对象 Comparator
网友评论