Java LinkedHashSet

来源:互联网 发布:ip网络计算 编辑:程序博客网 时间:2024/05/16 11:05
public class LinkedHashSet<E>    extends HashSet<E>    implements Set<E>, Cloneable, java.io.Serializable


首先,从上面代码可以看出,LinkedHashSet是HashSet的一个子类,并且实现了Set接口,Cloneable接口和Serializable接口.

LinkedHashSet和HashSet的区别在于,LinkedHashSet维护了一个双向链表来存储元素.也就是说,在LinkedHashSet中,成员变量map是一个LinkedHashMap(而在HashSet中,map是一个HashMap).

这个LinkedList定义了遍历的顺序.并且,重新insert一个已经存在的元素不会影响该元素在list中原来的位置.


LinkedHashSet可以使我们避免HashSet带来的混乱的顺序,TreeSet带来的不断增加的消耗,并且无论原先的容器是什么,只要其是Set类型,那么LinkedHashSet可以复制一份完全一样顺序的副本,并且在这个副本中,顺序是确定的.这种技术对于需要对于顺序有要求的时候非常有用.

这个类提供了所有的Set操作,并且允许null元素. 类似于HashSet,它提供常数时间的基础操作性能,如:add,contains,remove,前提是hash函数能够将元素正确的分配到各个桶中.LinkedHashSet的性能可能稍微比HashSet低一点(要维护Linked list),但是有一个例外:在LinkedHashSet上遍历时,所需要的时间和Set的Size成正比,而无论其capacity是多大.相对比的,HashSet在遍历时倾向于更加expensive,因为它的遍历时间是与capacity成正比的.


LinkedHashSet有两个影响性能的参数:初始capacity和load factor,这和HashSet一致,但是有一点不同,如果初始化时指定一个巨大的capacity,那么LinkedHashSet比HashSet表现更好,因为遍历的时候LinkedHashSet只依赖于size,而HashSet依赖于capacity.


LinkedHashSet的实现是线程不安全的,在多个线程同时改变时,需要在外部指定同步.通常可以通过:

Set s = Collections.synchronizedSet(new LinkedHashSet(...));

来创建一个线程安全的实例.


在获得了iterator时,一旦通过remove方法修改了容器,那么立刻会抛出:

ConcurrentModificationException

这是为了在并发时能够避免出错的fast-fail设计.


1.构造函数

public LinkedHashSet(int initialCapacity, float loadFactor) {        super(initialCapacity, loadFactor, true);}
loadFactor默认是0.75.initialCapacity如果不指定,默认是16.



有关HashSet和HashMap的代码下次继续.

0 0
原创粉丝点击