1、概述
HashSet
(无序,唯一): 基于HashMap
实现的,底层采用HashMap
来保存元素,线程不安全
public HashSet() {
map = new HashMap<>();
}
LinkedHashSet
:LinkedHashSet
是HashSet
的子类,并且其内部是通过LinkedHashMap
来实现的,能够按照添加元素的顺序进行遍历TreeSet
(有序,唯一,不允许为null):底层实际上是一个TreeMap
实例,底层使用红黑树(自平衡的排序二叉树),能够按照添加元素的顺序进行遍历。
- TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
适用场景分析:HashSet是基于Hash算法实现的,其性能通常都是优于TreeSet。为了快速查找而设计的Set,我们通常都应该使用HashSet,在需要排序的功能时才使用TreeSet。
- HashSet 用于不需要保证元素插入和取出顺序的场景,
- LinkedHashSet 用于保证元素的插入和取出顺序满足 先进先出 的场景,
- TreeSet 用于支持对元素自定义排序规则的场景。
HashSet
1)基本运算
- 添加,add
- 删除,remove
- 判断是否存在,contains
- 删除集合中所有元素,clear
- 计算大小,size
- 判断是否为空,isEmpty
- 转换为字符串,toString
** 2)HashSet如何检查重复**
当把对象加入到HashSet时,HashSet会先计算对象的hashcode值来判断对象加入位置,同时也会与其他加入对象的hashcode值进行比较,如果没有相符的hashcode,HashSet会假设对象没有出现过,但是如果发现有两个对象的hashcode值相等,那么会调用equals方法来检查hashcode相对的对象是否真的相等,如果相等,就不让该对象加入到HashSet中。
3)hashset如何存放自定义对象?(实现add)
1.创建对象的的时候调用hashcode得出哈希值,即索引(存放的位置)
2.得出哈希值相等,用哈希值相等已经存入的对象和将要存入的对象进行equals方法比较,如果为true则不存
3.在java8中,如果一条链表个数超过8,且table>=64,就转成红黑树,先扩容table(2倍速)
LinkedHashSet
1)基本方法
- add,添加
- remove,删除
TreeSet
1)基本操作
- 添加元素,add
- 删除元素,remove
- 是否包含,contains
- 元素数,size
遍历
1)foreach
for (Integer e : set) {
System.out.println(e);
}
2)迭代器
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
System.out.println(next);
}
2)红黑树是一种自平衡二叉查找树 ,有良好的查找性能(logn)
红黑树是一棵二叉搜索树,它在每个节点增加了一个存储位记录节点的颜色,可以是红色,也可以是黑色;通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡。
红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)如果一个节点是红色,那么它的两个子节点就是黑色的(没有连续的红节点)
(4)对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点。 **(5) 每个页节点都是黑的 **
(6)所有左节点都<=父节点,所有右节点都>父节点
遍历
- 使用toArray(),转换成一个数组,对数组进行遍历;
- toArray(T[] a) 里面可以传递一个数组把集合当中的元素存储到传入的数组当中去
- 迭代器遍历;
- 增强for遍历;