LinkedHashSet原理

36 阅读1分钟

说明

  • LinkedHashSet是HashSet的子类,扩容机制一样,因子也是0.75;
  • LinkedHashSet底层是一个LinkedHashMap;
  • 线程不安全;
  • 第一次添加时候,直接将table数组扩容到16;
public LinkedHashSet() {
    //默认初始容量是16,默认加载因子是0.75
    super(16, 0.75F, true);
}

//super
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    this.map = new LinkedHashMap(initialCapacity, loadFactor);
}
  • LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的;
  • LinkedHashSet不允许添加重复元素;

源码说明

LinkedHashSet除了几个构造函数, 基本上都是调用父类HashSet的构造函数;

  • LinkedHashSet 中维护了一个hash表和双向链表(LinkedHashSet有head头节点和tail尾节点)
  • 数组类型是HashMapNode[],存放的节点类型是LinkedHashMapNode[],存放的节点类型是LinkedHashMapEntry,每个节点有个before和after属性,指向前节点和后节点
  • 在添加一个元素时,先求hash值,再求索引,确定该元素在table的位置,然后将添加的元素加入到双向链表(如果已经存在,不添加[原则和HashSet一样])