8.3.5 各Set实现类的性能分析
8.3.5 各Set实现类的性能分析
优先使用HashSet
HashSet
和TreeSet
是set
的两个典型实现,到底如何选择HashSet
和TreeSet
呢?HashSet
的性能总是比TreeSet
好(特别是最常用的添加、查询元素等操作),因为TreeSet
需要额外的红黑树算法来维护集合元素的次序。
需要排序时使用TreeSet
只有当需要一个保持排序的Set
时,才应该使用TreeSet
,否则都应该使用HashSet
。
LinkedHashSet有序
HashSet
还有一个子类: LinkedHashSet
,对于普通的插入、删除操作, LinkedHashSet
比HashSet
要略微慢一点,这是由维护链表所带来的额外开销造成的,但由于有了链表,遍历LinkedHashSet
会更快。
EnumSet用来保存枚举
EnumSet
是所有Set
实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。
HashSet TreeSet EnumSet都是线程不安全的
必须指出的是,Set
的三个实现类HashSet
、 TreeSet
和EnumSet
都是线程不安全
的。如果有多个线程同时访问一个Set
集合,并且有超过一个线程修改了该Set
集合,则必须手动保证该Set
集合的同步性。
如何线程安全:使用Collections工具类包装Set集合
通常可以通过Collections
工具类的synchronizedSortedSet
方法来”包装”该Set
集合。此操作最好在创建时进行,以防止对Set
集合的意外非同步访问。例如:SortedSet s= Collections.synchronizedSortedSet(new TreeSet(...));
关于Collections
工具类的更进一步用法,可以参考8.8节的内容。