HashSet、LinkedHashSet、TreeSet三者的区别
- HashSet:作为Set接口的主要实现类,线程不安全的,可存储null值
- LinkedHashSet:是HashSet的子类,遍历内部数据时,可根据添加顺序显示
- TreeSet:实现算法:红黑树,可以按照添加对象的指定属性进行排序
Set的特点——无序性、不可重复性(以HashSet为例)
- 无序性:Set底层也是利用数组储存,添加的顺序并非根据索引来添加,而是根据哈希值进行排序
- 不可重复性:保证添加元素按照equals()时,返回值不能为true,即相同的元素只能添加一个
Set添加元素的过程(以HashSet为例)
要求:在添加元素时,要求元素的类必须重写HashCode()和equals()方法,并且这两个方法要尽可能的保证一致性
- 当我们往数组中添加元素时,会根据元素的哈希值进行计算返回一个在数组中存储的位置(无序性)
- 当这个位置当前没有元素则直接添加,如果有元素的话,则将两个元素的哈希值进行比较
- 如果哈希值不一样,新的元素就和之前的元素形成一个链表的模式,JDK8中新的元素在之前的元素下面,当哈希值一样时,再将两个元素进行equals比较
- 如果不一样,则也是形成链表模式,反之则不允许添加(不可重复性)
LinkedHashSet的实现原理
- 相较于HashSet,LinkedHashSet在遍历时,输出的顺序是根据添加的顺序
- 在添加元素时,顺便添加了两个变量,用于记录前一个元素和后一个元素,相当于双向链表
- 在频繁的使用遍历操作的集合时,LinkedHashSet效率要高于HashSet
TreeSet使用方式
- 分为自然排序(实现Comparable接口)和定制排序(Comparator)
- TreeSet必须存储同一类型的数据,且该类必须重写comparable方法
- 自然排序中,TreeSet采用的时compareTo方法,而不是equals()
- 定制排序中,TreeSet采用的时compare方法,而不是equals()