1. 首页
  2. 乌拉客

LinkedHashSet源码解析

在上一篇中我们介绍了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的底层一样。

  • 总结
  • LinkedHashSet集合可以保证添加元素的顺序与访问元素的顺序一致
  • LinkedHashSet集合不能保存相同的元素
  • LinkedHashSet集合并不是线程安全的集合类

原创文章,作者:二十四分之七倍根号六,如若转载,请注明出处:https://jilinwula.com/249.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

邮件:admin@jilinwula.com

QQ:923505769

 

QR code