LinkedHashSet源码解析

/ Java / 没有评论 / 309浏览

在上一篇中我们介绍了LinkedHashMap集合的底层实现,并了解了LinkedHashMap底层是通过HashMap集合实现的。所以LinkedHashMap集合除了具有自己独特的特性外,其它的特性基本和HashMap的特性是一样的。那么在这一篇我们将学习LinkedHashSet集合的知识。在HashSet这篇文章中我们已经介绍过HashSet底层也是通过HashMap集合实现的。所以我们通过LinkedHashSet集合的名字就基本可以猜到,LinkedHashSet集合底层应该就是用LinkedHashMap集合实现的。这是因为只有LinkedHashMap这种集合的底层实现才能保证LinkedHashSet集合添加元素的顺序与访问元素的顺序一致,这也就是LinkedHashSet集合相比HashSet集合的一种独特的特性。为了证明我们上述所说的,我们简单查看一下LinkedHashSet集合的源码,因为大部分源码涉及到的逻辑已经在LinkedHashMap集合中介绍过了,所以这里我们只是简单的查看,不做过多的说明。还是和其它集合一样 ,我们首先看LinkedHashSet集合的初始化。

public LinkedHashSet() {
super(16, .75f, true); // 设置默认的底层数组大小及加载因子
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor); // 创建LinkedHashMap对象此代码是在HashSet中定义的,因为LinkedHashSet继承了HashSet
}
public LinkedHashMap(int initialCapacity, float loadFactor) { // 调用LinkedHashMap中的初始化方法
super(initialCapacity, loadFactor);
accessOrder = false;
}
public HashMap(int initialCapacity, float loadFactor) { // 调用HashMap中的初始化方法
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}

下面我们看一下LinkedHashSet中add方法的底层实现。

public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
private static final Object PRESENT = new Object();

我们看上面代码逻辑就是直接调用了map的put方法,这一点和HashSet的底层一样。