Java集合框架源码解析之LinkedHashSet
阅读本节内容需要读者对 HashMap 、HashSet 和 LinkedHashMap 的源码有所了解,因为 LinkedHashSet 的内部实现都是来自于这三个容器类,其内部源码十分简单,简单到它只有一个成员变量、四个构造函数、一个 Set 接口的方法
如果你想多了解下这三个容器类,可以从这里获得:Java集合框架源码解析
LinkedHashSet 的所有源码如下所示
package java.util;
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
//序列化ID
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 继承于 HashSet,而 LinkedHashSet 调用的父类构造函数均是
private transient HashMap<E,Object> map;
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
即 LinkedHashSet 底层是依靠 LinkedHashMap 来实现数据存取的,而 LinkedHashMap 继承于 HashMap,在内部自己维护了一条双向链表用于保存元素的插入顺序,因此使得 LinkedHashSet 也具有了存取有序,元素唯一的特点
关于 LinkedHashSet 的源码实在也没什么好讲的,它的实现都是依靠其他容器类来组合支持的,所以如果想了解 LinkedHashSet ,就只能先去了解 HashMap 、HashSet 和 LinkedHashMap 的源码
如果想多了解一些 Java 的集合框架源码解析,可以看这里:Java集合框架源码解析

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Javascript闭包
维基百科:在计算机科学中,闭包(Closure),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 上面的解释难免有些抽象,为了化繁为简,本文将通过实例的方式,探究Javascript中闭包的概念及其用途。为了更好地理解闭包,我将从Javascript的变量的作用域谈起。 一、Javascript变量的作用域 有点类似于原型链(proto chain),Javascript中变量遵从作用域链(scope chain)规则。 scope_chain.png 如上图所示,在Javascript中,每一个函数体对应于一个作用域。 当访问一个变量时,我们会先访问当前作用域内是否有定义该变量,如果没有就会在该作用域外的作用域内寻找是否有改变量,依此类推,一直寻找到全局变量。如果全局变量中依旧没有定义该变量,就会返回undefined。 我们来看下下面这个例子: var milk = '外面的特仑苏' function wrapper1() { var milk = '里面的...
-
下一篇
systemptap系列之用户空间探针
起初systemtap 是聚焦于内核空间的,因为用户层的诊断工具真的很多,后来还是在0.6版本时候可以探测用户进程了,既然可以用,那就用它吧。 Systemtap用uprobes 模块来执行用户层的探测,在内核3.5以后,已经包含了,可以查看内核的config文件中CONFIG_UPROBES参数。 1. 用户层事件 用户事件可以通过PID来限定,也可以通过可执行路径来限定。 有些事件限制了必须使用一个特定的PATH,因为需要debug信息来静态分析将探针放在哪里。 例如: process(“PATH”).function(“function”),用户空间函数入口。类似内核函数的kernel.function(“function”)。 process(“PATH”).statement(“statement”),类似kernel.statement(“statement”). process(“PATH”).mark(“marker”),静态点marker定义在PATH .很多应用提供静态探针.例如java的hotspot JVM. probe hotspot.gc_begi...
相关文章
文章评论
共有0条评论来说两句吧...