Set

87 阅读2分钟

Set接口介绍

Set接口继承自Collection接口,Set接口中没有新增方法,他和Collection接口保持一致,之前学习的List接口的使用方法,在Set中仍然适用。

Set接口特点

  • 无序 其中的元素没有索引,只能遍历查找
  • 不可重复 不允许加入重复的元素。确切的说,如果新元素与Set中的某个元素通过equals()方法对比为true,则只会保留一个

Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet。

HashSet容器的使用

HashSet是Set接口的实现类。是Set存储特征的具体实现。

添加元素

set.add("a");

删除元素

set.remove("c2");

获取元素,在Set容器中没有索引,所以没有对应的get(int index)方法

HashSet存储特征分析

HashSet是一个不保证元素的顺序且没有重复元素的集合,是线程不安全的,HashSet允许有null元素。

  • 无序 在HashSet底层是用HashMap存储数据的,HashMap底层使用的是数组与链表实现元素的存储。元素在数组中存放时,并不是有序存放的,也不是随机存放的,而是对元素的哈希值进行运算决定元素在数组中的位置
  • 不重复 当两个元素的哈希值进行运算后得到相同的在数组中的位置时,会调用元素的equals()方法判断两个元素是否相同,如果相同则不会添加该元素,如果不相同,则会使用单向链表保存该元素。

通过HashSet存储自定义对象

见文档

HashSet源码分析

见文档

TreeSet容器的使用

TreeSet实现了Set接口,它是一个可以对元素进行排序的容器底层是使用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储数据。TreeSet内部需要对存储的元素进行排序,因此,我们需要给定排序规则。

排序规则实现方式:

  • 通过元素自身实现比较规则。 在元素自身实现比较规则时,需要实现Comparable接口中的compareTo方法,该方法中用来定义比较规则。TreeSet通过调用该方法来完成对元素的排序处理。
  • 通过比较器指定比较规则。 通过比较器定义比较规则时,我们需要单独创建一个比较器比较器需要实现Comparator接口中的compare方法来定义比较规则。在实例化TreeSet时将比较器对象交给TreeSet来完成元素的排序处理。此时元素自身就不需要实现比较规则了。

TreeSet底层源码分析

见文档 单例集合使用案例