java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java的LinkedHashSet

浅析Java集合中的LinkedHashSet

作者:晓之木初

这篇文章主要介绍了浅析Java集合中的LinkedHashSet,LinkedHashSet 是 Java 中的一个集合类,它是 HashSet 的子类,并实现了 Set 接口,与 HashSet 不同的是,LinkedHashSet 保留了元素插入的顺序,并且具有 HashSet 的快速查找特性,需要的朋友可以参考下

1. 类的特性

LinkedHashSet的类注释,提供了以下信息

性能:

总结:

疑问:

2. LinkedHashSet & LinkedHashMap

2.1 LinkedHashSet的实现如此简单

查看LinkedHashSet源码,其结构如下

在这里插入图片描述

除了构造函数,没有常见的set类的关键方法,甚至没有成员变量

让人感觉很神奇,为何实现如此简单?

2.2 类图

LinkedHashSet类的定义如下

public class LinkedHashSet<E> extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable 

类图如下

在这里插入图片描述

查看LinkedHashMap的类图,二者非常相似,简直是照葫芦画瓢

2.3 关联分析

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

巧妙之处来了:

LinkedHashSet的构造函数,实际都调用HashSet的上述 default 构造函数

也就是说,LinkedHashSet中的 map 字段,实际为LinkedHashMap类型

这样,所有entry之间就存在一个双向链表,即LinkedHashSet的所有元素之间存在一个双向链表

从而,LinkedHashSet中元素是有序的,为元素的插入顺序

// 指定初始化容量和loadFactor的空set
public LinkedHashSet(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor, true);
}
// 指定初始化容量、使用默认loadFactor的空set
public LinkedHashSet(int initialCapacity) {
    super(initialCapacity, .75f, true);
}
// 使用默认值构建一个空set
public LinkedHashSet() {
    super(16, .75f, true);
}
// 基于指定的元素构建一个set
public LinkedHashSet(Collection<? extends E> c) {
    super(Math.max(2*c.size(), 11), .75f, true);
    addAll(c);
}

2.4 为何不支持访问顺序?

从HashSet的 default 构造函数可以看出,构建的LinkedHashMap将默认使用插入顺序

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

因此,基于LinkedHashMap的LinkedHashSet,也将使用插入顺序

没有其他的构造函数可以提供一个具有访问顺序的LinkedHashMap,LinkedHashSet自然也不会支持访问顺序

3. 总结

关于LinkedHashSet

与HashSet的区别

到此这篇关于浅析Java集合中的LinkedHashSet的文章就介绍到这了,更多相关Java的LinkedHashSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文