【Java基础】——Set集合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013044029/article/details/78004929

前言

   上一篇【Java基础】——集合里已经对Java集合进行大概的介绍和了解,这篇文章将对Java集合里的Set集合类型进行讨论学习。


概述

    Set集合类似于一个罐子,程序可以依次把多个对象放入Set集合里,而Set集合通常不能记住元素的添加顺序。Set集合与Collection基本相同,不同的事Set集合不允许包含相同的元素。Set集合主要有:HashSet、TreeSet和EnumSet三个实现类。


HashSet集合

  HashSet是Set接口的典型实现,一般情况下使用Set集合时就是使用这个实现类。HashSet以hash算法来存储集合中的元素,因此它就有很好的存取和查找性能。


   当向HashSet集合中存入一个元素是,HashSet会调用该对象的hashCode方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置。HashSet通过equals()方法比较两个元素的hashCode值,如果相同返回false,不同则返回true。


    HashSet具有以下特点:

        1)不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。


        2)HashSet不是同步的,如果多个线程同时访问一个HashSet,假设有两个或这两个以上的线程同时修改了HashSet集合时,则必须通过代码来保证同步。


        3)集合元素值可以是NULL。


   HashSet还有一个子类LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保证的。LinkedHashSet需要维护元素的插入顺序,所以它的性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能。


TreeSet集合

   TreeSet实现了SortedSet接口,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方法:自然排序和定制排序,在默认情况下,TreeSet采用自然排序。


   与HashSet相比,TreeSet还提供了如下几个额外的方法。

    1)Comparator comparator():如果TreeSet采用了定制排序,则返回定制排序所使用的Comparator;如果TreeSet采用了自然排序,则返回NULL;


    2)Object firset:返回集合中的第一个元素;


    3)Object last:返回集合中的最后一个元素


    4)Object lower(Object e):返回集合中位于指定元素之前的元素;


    5)Object higher(Object e):返回集合中位于指定元素之后的元素;


    6)SortedSet subSet(Object fromElement,Object toElement):返回次Set的子集合,范围从fromElement(包含)到toElement(不包含);


    7)SortedSet headSet(Object toElement):返回此Set的子集,由小于toElement的元素组成;


    8)SortedSet tailSet(Object fromElement):返回此Set的子集,由大于或等于fromElement的元素组成。


EnumSet集合

   EnumSet是一个专为美剧类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,在创建是可以显式或隐式地指定。EnumSet的集合时有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序。


   EnumSet在内部以位向量的形式存储,这中存储形式非常紧凑、高效,因此EnumSet对象占用内存很小,而且效率很好。


   EnumSet集合不允许加入NULL元素,如果试图插入NULL元素,EnumSet讲抛出NullPointerException异常。


对比分析

    TreeSet需要额外的红黑树算法来维护集合元素的次序,所以在性能上不如HashSet,如果Set需要保持排序,才应该使用TreeSet。


    HashSet有一个子类LinkHashSet,由于LikedHashSet需要维护链表,对于普通的插入、删除操作,LinkedHashSet比HashSet要略微慢一点,但也因此,遍历LinkedHashSet会更快。


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


    Set的三个实现类都是线程不安全的,通常通过Collections工具类的synchronizedSortedSet方法来“包装”该集合。


猜你喜欢

转载自blog.csdn.net/u013044029/article/details/78004929