码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-28 23:17:05      阅读:353      评论:0      收藏:0      [点我收藏+]

标签:

本文主要讲Collection接口之一Set接口及其实现类。

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


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

技术分享

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

  1. HashSet类
    1. 字面上猜测,跟hash算法有关
    2. 子类LinkedHashSet,在其基础上添加了Linked链接,可能是按照指针穿起来
  2. SortedSet接口
    1. 字面猜测,已经排序,只是不知道是按照何种方式进行排序的
    2. TreeSet类,默认是根据树形结构存储?
  3. EnumSet类
    1. 与枚举类型有关?

技术分享


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

一、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(...) );


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

标签:

原文地址:http://blog.csdn.net/zhaolijing2012/article/details/46127959

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!