**Set集合存储的元素是无序的,而且不能存储重复的元素,**每当有新的元素存入的时候,Set集合会先去过滤,如果发现和集合中的元素出现重复,就不允许添加。
应用场景
当我们不想让集合中出现重复的元素的时候,使用Set集合
当我们需要排除重复数据时,使用Set集合
HashSet
-
定义
- HashSet集合中的元素是通过hash值来比较是否相同
- 集合通过元素的hashCode和equals方法来比较两个元素是否相同, 不同就存入, 相同不存入
- 元素存入的位置未知,和存入的顺序无关
-
存储原理
- HashSet最后还是存入数组中, 只是根据元素的Hash值来确定存入的角标位置
- 元素的hash值 ^ (元素的hash值 >>> 16) & (数组的长度-1)
- HashSet中不是直接存入我们给定的元素, 而是用集合中的一个内部类封装我们存入的元素,所以当我们存入null的时候,不会因为和数组中角标位上默认值null起冲突
- 如果两个不同的元素根据不同的Hash值计算出了同一个角标值,那么都能存进去
- HashSet最后还是存入数组中, 只是根据元素的Hash值来确定存入的角标位置
-
构造方法
- HashSet() 构造出一个新的集合, 底层数组默认的初始容量是16(扩容一倍),加载因子是0.75
- 加载因子: 集合中的数组可用的
- 角标值得可选范围越小,计算出重复角标值得概率就越高
- HashSet(Collection<? extends E> c) 构造一个包含指定collection中元素的新set
- HashSet() 构造出一个新的集合, 底层数组默认的初始容量是16(扩容一倍),加载因子是0.75
-
常用方法
- boolean add( E e) 如果此set集合中尚未包含指定元素,则添加指定元素
- boolean remove(Object o) 移除某个元素 []
- int size() 获取集合的长度
原理解析
- HashSet是通过调用元素的hashCode和equals方法来比较两个元素是否形同的,所以如果要保证引用数据类型逻辑上的唯一性,就必须重写hashCode方法和equals方法
LinkedHashSet:兼顾了linked的有序性和HashSet的元素唯一性
TreeSet集合
-
定义
- TreeSet是一种顺序的集合, 记住, 这里的顺序是指集合中的元素有顺序, 她是通过比较元素的大小来存放的, 大的存右边,小的存左边
- 存入的元素必须实现Comparable接口,并且重写comparTo方法
- 最后存入的元素会形成一个树状结构
-
构造方法
- TreeSet() 构造一个新的空set, 该set根据其元素的自然顺序进行排序
- TreeSet(Comparator <? super E> comparator) 构建一个空的TreeSet, 他根据指定比较器进行排序
-
常用方法
- add(E e) 将指定元素添加到此set
- first() 返回此set中当前第一元素
- last() 返回此set中当前最后一个元素
- floor() 返回此set中小于等于给定元素的最大元素,不存在则返回null
- higher() 返回此set中严格大于给定元素的最小元素,不存在则返回null