LinkedHashSet源码看下
时间: 2024-09-10 17:30:33 浏览: 42
Java源码分析:集合-容器.pdf
`LinkedHashSet` 是 Java 集合框架中 `Set` 接口的一个实现,它维护了一个双向链表来保证元素的插入顺序。它是 `HashSet` 的一个变种,后者不会记录插入顺序,因此 `LinkedHashSet` 在需要维护插入顺序的情况下非常有用。
`LinkedHashSet` 是基于 `LinkedHashMap` 来实现的。`LinkedHashMap` 通过在 `HashMap` 的基础上添加了一对儿前后指针,形成了双向链表。这样一来,它就可以记录插入顺序,也可以实现快速的访问。
下面是一个简化版的 `LinkedHashSet` 的源码结构,用于展示其基本的实现方式:
```java
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
private static final long serialVersionUID = -2851667679971038690L;
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}
public LinkedHashSet() {
super(16, .75f, true);
}
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true);
addAll(c);
}
@Override
public Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED);
}
// 由于 LinkedHashSet 是基于 LinkedHashMap 实现的,所以这里返回 LinkedHashMap 实例
@Override
public Iterator<E> iterator() {
return backingMap().keySet().iterator();
}
// 以下是不重要的方法实现,省略...
// 由于 LinkedHashSet 是基于 LinkedHashMap 实现的,这里可以访问 LinkedHashMap 的实例
private LinkedHashMap<E, ?> backingMap() {
return (LinkedHashMap<E, ?>) backingMap;
}
}
```
可以看到,`LinkedHashSet` 的大部分方法都是委托给 `HashSet` 的,而 `HashSet` 又是委托给其背后的一个 `HashMap`(实际上是 `LinkedHashMap`)来完成实际操作的。`LinkedHashSet` 只是添加了一些必要的构造函数,并且对外提供了一个迭代器来按照插入顺序访问元素。
阅读全文