1、概述

  • HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素,线程不安全
public HashSet() {
    map = new HashMap<>();
}
  • LinkedHashSetLinkedHashSetHashSet 的子类,并且其内部是通过 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遍历;