Set集合常用的类

一、HashSet类

HashSet具有以下特点:

(1)HashSet具有很好的对象检索性能,当从HashSet中查找某个对象时,Java系统首先调用对象的hasCode方法获得该对象的哈希码,然后根据哈希码找到对应的存储区域,最后取出该存储区域的每个元素与该对象进行equals方法的比较,这样不用遍历集合中的所有元素就可以得到结论。

(2)HashSet存储对象的效率相对要低些,因为向HashSet集合中添加对象的时候,首先要计算出来对象的哈希码和根据这个哈希码来确定对象在集合中的存放位置。

(3)不能保证排列的顺序,顺序有可能发生改变。

(4)HashSet不是同步的,如果多个线程同时访问一个Set集合,如果多个线程同时访问一个HashSet集合,如果有2条或者2条以上线程同时修改了HashSet集合时,必须通过代码来保证其同步。

(5)HashSet集合元素可以是null。
HashSet还有一个子类LinkedHashSet,LinkedHashSet集合也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使的元素看起来是以插入的顺序保存的。也就是说当遍历LinkedHashSet集合里的元素时,HashSet将会按元素的添加顺序来访问集合里的元素。
LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但是在迭代访问Set里的全部元素时,将有很好的性能,因为它以列表来维护内部顺序。

二、TreeSet类

TreeSet是SortedSet接口的唯一实现(SortedSet接口继承Set接口),正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态。TreeSet并不是根据元素的插入顺序进行排序,而是根据元素实际值来进行排序的。
与HashSet集合采用的hash算法来决定元素的存储位置不同,TreeSet采用红黑树的数据结构对元素进行排序。那么TreeSet进行排序是怎么样的呢?TreeSet支持两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序。

三、总结

这里写图片描述
(1)HashSet和TreeSet是Set的两个典型实现,HashSet的性能总是比TreeSet好(特别是比较常用的添加、查询元素等操作),因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。

(2)HashSet还有一个子类:LinkedHashSet,对于普通插入、删除操作,LinkedHashSet比HashSet要略微慢一点;这是由维护链表所带来的额外开销所造成的,不过,因为有了链表,遍历LinkedHashSet会更快。

(3)EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值做为集合元素。

(4)Set的三个实现类HashSet(包括LinkedHashSet)、TreeSet和EnumSet都是线程不安全的。如果有多个线程同时访问一个Set集合,并且有超过一条线程修改了该Set集合,则必须手动保证该Set集合的同步性。通常可以通过Collections工具类的synchronizedSet方法来”包装”该Set集合。此操作最好在创建时进行,以防止对Set集合的意外非同步访问。例如:
Set hs = Collections.synchronizedSet(new HashSet());

猜你喜欢

转载自blog.csdn.net/u012017783/article/details/82734289