今天继续总结java常用集合Set
set集合是无序、不可重复的容器,set集合主要派生出来的常用的有 HashSet 、TreeSet、 LinkedHashSet
一、HashSet
HashSet是按照Hash算法来存储元素的,因此具有很好的存取和查找性能,HashSet是无序、不可重复的
HashSet具有以下特点
- 不能保证元素的排列顺序
- HashSet 不是线程同步的,如果多个线程访问同一个hashSet集合,有第二个线程对hashset进行了改变,必须通过代码来保证同步
- 集合可以存储null元素
在这里我们既然说HashSet是不可重复的,我们就应该要知道是怎么保证数据部重复的,当向HashSet集合存入一个对象时,HashSet 会调用该对象的hashCode方法取得hashCode值然后决定它的存储位置。如果2个对象的hashCode值不一样,但是equals方法返回为true,它照样会把填加在不同的位置上。
所以HashSet判断2个对象相等:必须hashCode返回值一样,equals方法返回为true。
二、LinkedHashSet
LinkedHashSet是HashSet的子类,因为引用了链表结构所以是有序、不可重复的
LinkedHashSet具有以下特点
- 能保证元素的排列顺序
- 不是线程同步的
- 集合可以存储null元素
LinkedHashSet判断2个对象相等:必须hashCode返回值一样、equals方法返回true。
LinkedHashSet相对HahsSet插入、删除的速度慢,因为需要维护链表的开销,但是在迭代遍历速度上面要快。
三、TreeSet
TreeSet是有序、不可重复的
TreeSet是采用红黑树的数据结构对元素进行排序,支持两种排序方法:自然排序和定制排序,默认自然排序。
判断2个对象相等:equals方法返回true,compareTo方法返回0。
HashSet和TreeSet是常用的2个set集合,到底什么时候选择使用哪个呢?
HashSet在插入和查询上面性能要比TreeSet 要好因为TreeSet需要额外的红黑树算法来进行排序,所以如果我们需要一个有序的set集合我们可以考虑使用TreeSet否则都应考虑使用HashSet。