Java集合Set性能分析

来源:互联网 发布:预防域名攻击 编辑:程序博客网 时间:2024/05/16 14:47

Set性能分析

HashSet 和 TreeSet

  • HashSet性能要好于TreeSet(特别是最常用的添加、查询元素等操作)

    原因:因为TreeSet需要额外的红黑树算法维护集合元素的次序。只有需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。

HashSet 和 LinkedHashSet

  • HashSet 还有一个子类:LinkedHashSet,对于普通的插入,删除操作,LinkedHashSet比HashSet要略微慢一点,这是由维护链表所带来的额外开销造成的,但由于有了链表,遍历LinkedHashSet会更快。

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

注意:

Set的三个实现类HashSet、TreeSet和EnumSet都是线程不安全的。
如果有多个线程同事访问一个Set集合,并且有超过一个线程修改了该Set集合,则必须手动保证该Set集合的同步。

同步:

解决:通常通过Collections工具类的synchronizedSortedSet方法来“包装”该Set集合。
注意:此操作最好在创建时进行,以防止对Set集合的意外非同步访问。

示例:

SortedSet set = Collections.synchronizedSortedSet(new TreeSet());

Collections 工具类其他同步方法:

  • synchronizedCollection(Collection<T> c)
    这个方法返回一个同步的(线程安全的)集合的指定集合的支持。
  • synchronizedList(List<T>list)
    这个方法返回由指定列表支持的同步(线程安全的)列表。
  • synchronizedMap(Map<K,V> m)
    这个方法返回一个同步的(线程安全)由指定映射支持。
  • synchronizedSet(Set<T> s)
    这个方法返回一个同步的(线程安全的)集由指定set支持。
  • synchronizedSortedMap(SortedMap<K,V> m)
    这个方法返回一个同步的(线程安全的)有序映射所指定的有序映射支持
    synchronizedSortedSet(SortedSet<T> s)
    这个方法返回一个同步的(线程安全的)有序set由指定的有序set支持。

    JDK1.8
    synchronizedNavigableMap(NavigableMap<K,V> m)
    synchronizedNavigableSet(NavigableSet<T> s)

Things won are done; joy’s soul lies in the doing.
得到即是完结,快乐的精髓在于过程。

0 0
原创粉丝点击