目录
一.Set接口概述
- Set接口:也称Set集合,但凡是实现了Set接口的类都叫做Set集合
- 特点:元素无索引,元素存取无序,元素不可重复(唯一)
- 实现类:
- HashSet集合:元素无索引,元素存取无序,元素不可重复(唯一)
- LinkedHashSet集合:元素无索引,元素存取有序,元素不可重复(唯一)
- TreeSet集合:元素无索引,元素存取无序,元素不可重复(唯一),元素可排序
- 注意:
- Set集合并没有特有的功能,都是使用Collection父接口中的方法
- Set集合元素无索引,所以遍历方式只能是:迭代器,增强for循环
二.HashSet集合
java.util.HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不能保证不一致)
public class Demo01 {
public static void main(String[] args) {
HashSet<String> set=new HashSet<String>();
set.add("nba");
set.add("cba");
set.add("bac");
set.add("abc");
set.add("abc");
System.out.println(set);//[cba, abc, bac, nba]
}
}
三.HashSet集合存储数据的结构(哈希表)
- 哈希表底层结构
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用数组处理冲突,同一hash值的链表都存储在一个数组里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。
四.HashSet存储自定义类型元素
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一.
五.LinkedHashSet集合
在HashSet下面有一个子类java.util.LinkedHashSet,它是链表和哈希表组合的一个数据存储结构
六.TreeSet集合
- TreeSet集合是Set接口的一个实现类,底层依赖于TreeMap,是一种基于红黑树的实现,其特点为:
- 元素唯一
- 元素没有索引
- 使用元素的自然顺序对元素进行排序,或者根据创建 TreeSet 时提供的Comparator比较器,进行排序,具体取决于使用的构造方法:
public TreeSet():根据其元素的自然排序进行排序 public TreeSet(Comparator<E> comparator): 根据指定的比较器进行排序