Map集合之LinkedHashmap

LinkedHashmap概述

LinkedHashMap 来自于 JDK1.4,直接继承自 HashMap。在 HashMap 基础上,通过维护一张基于整个哈希表的大双链表,解决了 HashMap 遍历元素时无序的问题

  • LinkedHashMapHashMap 的子类,与 HashMap 有着同样的数据存储结构。它保留了元素插入的顺序,可以使元素的输出顺序与输入顺序相同
  • LinkedHashMap 可以用来实现 LRU 算法
  • LinkedHashMap 同样是非线程安全的,只在单线程环境下使用

LinkedHashmap 源码剖析

LinkedHashMap 基本属性

除了继承 HashMap 的属性,LinkedHashMap 类中还增加了 3 个属性用于实现保证元素顺序

// 用来指向双向链表的头节点,整个 LinkedHashMap 中只有一个 header,  
// 它将哈希表中所有的 Entry 贯穿起来,header 中不保存 key-value 对,只保存前后节点的引用  
transient LinkedHashMap.Entry<K,V> head;

// 用来指向双向链表的尾节点
transient LinkedHashMap.Entry<K,V> tail;

// 排序方式:true:访问顺序迭代,false:插入顺序迭代
final boolean accessOrder;

LinkedHashMap 构造器

LinkedHashMap()

默认无参构造器,构造一个带默认初始容量为 16 和加载因子为 0.75 的空LinkedHashMap 实例。除了调用父类无参构造器之外,还设置 accessOrder=false,这表明使用插入顺序遍历元素

public LinkedHashMap() {
   
    // 调用父类 HashMap 的无参构造器
    super();
    accessOrder = false;
}

LinkedHashMap 常见的 API 方法

LinkedHashMap 的大部分方法的主体结构完全是使用的父类 HashMap 的方法。比如 put、remove

// 父类 HashMap 实现的方法
public V put(K key, V value) {
   
    return putVal(hash(key), key, value, false, true);
}

// 父类 HashMap 实现的方法
public V remove(Object key) {
   
    HashMap.Node<K,V> e;
    return (e = removeNode(hash(key), key, null, false, true)) == null ?
            null : e.value;
}

那么 LinkedHashMap 有没有自己的方法呢?当然有,并且还有一个特点,那就是这些方法和自己的三个属性有关,比如 get、containsValue、clear 方法等

// LinkedHashMap重写的 get方法,增加了 accessOrder的判断
public V get(Object key) {
   
    Node<K, V
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值