Java LinkedHashSet


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的代码下次继续.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值