LinkedHashSet详解

1、继承关系

java.lang.Object
  java.util.AbstractCollection<E>
      java.util.AbstractSet<E>
          java.util.HashSet<E>
              java.util.LinkedHashSet<E>

2、以哈希表和链表实现的set集合接口,迭代方式和我们预想的一致(因为查询速度的原因底层使用了散列,但是看起来它使用了链表来维护元素的插入顺序),这和hashset实现方式是不同的,因为在它所有的插入过程中都保持了一个双向链表的属性。链表定义了迭代顺序,即为我们向集合set中插入元素的顺序。注意如果一个元素被重复插入到集合中并不会改变集合的插入顺序。(如果元素e被添加到集合s中,会调用s.add(e)方法,但是s.contains(e)会在s.add(e)方法之前调用并返回true)。

链表的实现避免了插入到hashset中的元素的顺序的紊乱,也不会给TreeSet招致增加实现的代价。这可以用作生成一个set集合的副本,该set集合不论其原始集合是怎样实现的,它都会和原始集合一样,元素的顺序是不会改变的,例如:

void foo(Set m){
       Set   s=New LinkedHashSet(m);
}
这一技巧还是很有用的,尤其是当我们将一个集合作为输入,拷贝了这个集合的同时,拷贝的集合里面元素的顺序可以由拷贝自身确定。(集合中的元素的顺序通常和他们存在的顺序一致。)

3、该类提供了set集合的所有操作,并且允许元素为null。和hashset一样,我们假定哈希功能已经将容器中的元素存储位置分配好,所以它的基本操作(add,remove,contains)运行时间为常量时间。其性能比hashset稍微低一点,因为添加了维持链表特性的代价:迭代都需要一定比例的时间去计算set集合的大小,无论其容量大小是多少。hashset迭代代价比较高,其容量是需要一定时间比例的。

4、LinkedHashSet包含两个参数,这两个参数均会影响其功能:初始化容量和载入属性。在hashset方面,是精确定义的。然而,需要注意的是为实例初始化一个大容量的代价要比为hashset所付出的代价要小,因为此类的迭代次数不会被容量所影响。

注意,这一实现并不是同步的。如果多个线程同时进入了linkedhashset容器,且至少有一个线程修改了set容器,而这从外在看来一定是要同步的。这通常同步一些包含此set集合的对象来实现的。如果没有这样的对象存在,那么这个集合set应该被Collections.synchronizedSet方法“包”一下。这最好在创建时候就执行,以预防发生一些意外的事件:

 Set s = Collections.synchronizedSet(new LinkedHashSet(...));
5、由类的迭代器返回的迭代次数是实效很迅速的:在迭代创建后的如果集合set发生修改,除了通过迭代器自身的remove方法外的其它任何方法,迭代会抛出异常ConcurrentModificationException。因此,就同时修改元素而言,迭代会迅速且全部失效,而不是冒险去出现一些在未来某时不确定的行为。

注意迭代器的fail-fast特性不能保证,正如在非同步化修改中做保证也是不可能的。fail-fast迭代次数会在被动的尽力的基础上抛出 ConcurrentModificationException异常。因此,写一个依赖此异常来判定其正确性的程序的想法是错误的:迭代器里的fail-fast

行为仅应该被用作查找bug。

6、方法概要

Methods inherited from class java.util.HashSet
addclearclonecontainsisEmptyiteratorremovesize
 
Methods inherited from class java.util.AbstractSet
equalshashCoderemoveAll
 
Methods inherited from class java.util.AbstractCollection
addAllcontainsAllretainAlltoArraytoArraytoString
 
Methods inherited from class java.lang.Object
finalizegetClassnotifynotifyAllwaitwaitwait
 
Methods inherited from interface java.util.Set
addaddAllclearcontainscontainsAllequalshashCodeisEmptyiteratorremoveremoveAllretainAllsizetoArraytoArray


发布了234 篇原创文章 · 获赞 159 · 访问量 74万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览