标签:
本文主要讲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(...) );
标签:
原文地址:http://blog.csdn.net/zhaolijing2012/article/details/46127959