您的位置:首页 > 编程语言 > Java开发

一大波Java来袭(七)——Java集合之Set接口

2015-05-28 22:10 281 查看
本文主要讲Collection接口之一Set接口及其实现类。

          Set集合,特点:无序,不可重复

          上文中我们介绍,Set集合类似于一个罐子,被丢进去的元素是没有明显顺序的。仔细想来,应该不会是随机存储的吧?其存储方式必定有一定的规律,且听我慢慢道来。



Set接口的实现类,如图所示:

HashSet类
字面上猜测,跟hash算法有关
子类LinkedHashSet,在其基础上添加了Linked链接,可能是按照指针穿起来

SortedSet接口
字面猜测,已经排序,只是不知道是按照何种方式进行排序的
TreeSet类,默认是根据树形结构存储?

EnumSet类
与枚举类型有关?



让我们带着问题,去寻找答案吧!

一、HashSet

1. 特点:按照Hash算法来存储集合中的元素,具有很好的存取和查找性质。

2. 如何判断重复?确定存储位置?

          若添加新元素,首先判断equals

                      若false,则添加成功。

                      若返回true,则根据Hash算法判断hashCode()

                                 若相同,则添加失败。

                                 若不相同,则添加成功。存储位置:根据HashCode的值确定

3. 子类LinkedHashSet,特点:同时维护元素的插入顺序,性能低于HashSet

   

二、TreeSet,实现SortedSet接口,有序(根据元素实际值排序,而非插入顺序)

1. 对比 

          HashSet类,采用hash算法决定存储位置 

          TreeSet采用红黑树的数据结构对元素排序 

2. 2种排序方法 

          自然排序(默认) :调用Comparable接口的compareTo(Ojebct  o)方法,升序排列,根据红黑树算法确定存储位置 

          定制排序 :调用Comparator接口的int compare(T  o1, T  o2)方法

三、EnumSet,以枚举值在Enum类内的定义顺序来确定集合元素中的顺序

1. 存储方式:位向量。结构紧凑,高效,占用内存小。

四、性能比较

1. HashSet性能总是比TreeSet好,特别是常用的添加、查找操作。

          因此TreeSet中需要额外的红黑树算法来维护集合元素的次序。

          只有当需要一个保持排序的Set时,才使用TreeSet。否则都是用HashSet

2.LinkedHashSet是HashSet的子类,因为有了链表,所以在遍历时会更快。而由于维护链表所带来的额外开销,使得对于普通插入、删除,操作性能稍慢。

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

          

注意:Set的三个实现类:HashSet、TreeSet、EnumSet都是线程不安全的,需要手动保证Set集合的同步性。通常使用Collections工具类的synchronizedSortedSet方法来“包装”该Set集合。此操作最好是在创建时进行,防止对Set集合的意外非同步访问。

    SortedSet s = Collections.synchronizedSortedSet( new TreeSet(...) );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: