目录
一.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集合存储数据的结构(哈希表)
HashSet集合保证元素唯一的原理:HashSet集合存储数据的结构:哈希表结构哈希表结构:jdk8以前: 数组+链表jdk8以后:链表元素个数没有超过8个: 数组+链表链表元素个数超过8个: 数组+链表+红黑树保证元素唯一的原理: 主要依赖元素的hashCode()和equals()方法1.当集合要存储某个元素,就会调用该元素的hashCode()方法计算该元素的哈希值2.判断该哈希值对应的位置上,是否有相同哈希值的元素3.如果该位置上没有相同哈希值的元素,那么就直接存储4.如果该位置上有相同哈希值的元素,那么就产生了哈希冲突5.如果产生了哈希冲突,就会调用该元素的equals()方法与该位置上所有的元素一一进行比较:如果比较完后,该位置上任意一个元素与该元素相等,那么就不存储如果比较完后,该位置上没有一个元素与该元素相等,那么就存储回顾:
1.hashCode()和equals()是属于Object类的,所以所有的对象都有这2个方法2.Object类中的hashCode()方法主要是根据对象的地址值来计算哈希值 3.Object类中的equals()方法是比较2个对象的地址值是否相同
- 哈希表底层结构
在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): 根据指定的比较器进行排序
public TreeSet():根据其元素的自然排序进行排序public TreeSet(Comparator<E> comparator): 根据指定的比较器进行排序
TreeSet:集合中的元素无索引,元素不能重复(唯一),可以对集合中的元素进行排序
构造方法:public TreeSet(): 根据其元素的默认排序规则进行排序默认排序规则: 集合元素所属的类要求集合元素所属的类必须实现Comparable接口,重写compareTo方法,在compareTo方法中书写排序规则public TreeSet(Comparator<E> comparator): 根据指定的比较器进行排序通过参数Comparator比较器接口,来指定排序规则