当前位置: 首页>后端>正文

Java集合(六) —— LinkedHashSet源码分析

Java集合(一) —— Collection源码分析
Java集合(二) —— ArrayList源码分析
Java集合(三) —— LinkedList源码分析
Java集合(四) —— PriorityQueue源码分析
Java集合(五) —— HashSet源码分析
Java集合(六) —— LinkedHashSet源码分析
Java集合(七) —— TreeSet源码分析
Java集合(八) —— HashMap源码分析
Java集合(九) —— LinkedHashMap源码分析
Java集合(十) —— TreeMap源码分析

1.总结

1.LinkedHashSet使用LinkedHashMap存储数据。
2.LinkedHashSet是有序的,LinkedHashMap使用双向链表维护元素的插入顺序,所以可以按照元素的插入顺序访问它们。
3.LinkedHashMap支持按插入顺序或访问顺序维护元素的顺序,但是LinkedHashSet只支持以插入顺序排序。

2.LinkedHashSet继承关系图

Java集合(六) —— LinkedHashSet源码分析,第1张
LinkedHashSet.png

3.源码分析

1.构造方法

/**
 * 指定容量和负载因子
 */
public LinkedHashSet(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor, true);
}

/**
 * 指定容量
 */
public LinkedHashSet(int initialCapacity) {
    super(initialCapacity, .75f, true);
}

/**
 * 默认构造方法
 */
public LinkedHashSet() {
    // 默认初始容量为16,负载因子为0.75
    super(16, .75f, true);
}

public LinkedHashSet(Collection<extends E> c) {
    super(Math.max(2*c.size(), 11), .75f, true);
    addAll(c);
}

/**
 * LinkedHashSet的四个构造方法最终都调用HashSet的构造方法
 * 初始化一个LinkedHashSet
 */
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

public LinkedHashMap(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor);
    // 为false,表示不以访问顺序排序;这就是LinkedHashSet只以插入顺序排序的原因
    accessOrder = false;
}

通过分析构造方法可以看到LinkedHashSet使用LinkedHashMap保存数据。
另外LinkedHashSet除了这四个构造方法,就还只有一个迭代器方法,就这么简单。

4.与HashSet有什么不同?

  • HashSet是无序的,而LinkedHashSet以双向链表维护元素的插入顺序。
  • 因为LinkedHashSet要维护一个双向链表,所以性能要逊色于HashSet,所以要是不要求维护元素的顺序,优先使用HashSet。

https://www.xamrdz.com/backend/3z31926280.html

相关文章: