学习总结录 学习总结录
首页
归档
分类
标签
  • Java基础
  • Java集合
  • MySQL
  • Redis
  • JVM
  • 多线程
  • 计算机网络
  • 操作系统
  • Spring
  • Kafka
  • Elasticsearch
  • Python
  • 面试专题
  • 案例实践
  • 工具使用
  • 项目搭建
  • 服务治理
  • ORM框架
  • 分布式组件
  • MiniSpring
  • 设计模式
  • 算法思想
  • 编码规范
友链
关于
GitHub (opens new window)
首页
归档
分类
标签
  • Java基础
  • Java集合
  • MySQL
  • Redis
  • JVM
  • 多线程
  • 计算机网络
  • 操作系统
  • Spring
  • Kafka
  • Elasticsearch
  • Python
  • 面试专题
  • 案例实践
  • 工具使用
  • 项目搭建
  • 服务治理
  • ORM框架
  • 分布式组件
  • MiniSpring
  • 设计模式
  • 算法思想
  • 编码规范
友链
关于
GitHub (opens new window)
  • Java基础

  • Java集合

    • Java集合-ArrayList
    • Java集合-LinkedList
    • Java集合-Set
    • Java集合-Queue
    • Java集合-HashMap
    • Java集合-LinkedHashMap
      • Java集合-LinkedHashMap
      • LinkedHashMap要点
      • 构造方法
      • get方法
      • newNode方法
      • containsValue
      • 参考
    • Java集合-ConcurrentHashMap
  • MySQL

  • Redis

  • JVM

  • 多线程

  • 计算机网络

  • Spring

  • Kafka

  • Elasticsearch

  • Python

  • 面试专题

  • 知识库
  • Java集合
旭日
2023-03-31
目录

Java集合-LinkedHashMap

# Java集合-LinkedHashMap

LinkedHashMap通过维护一个保存所有条目(Entry)的双向链表,保证了元素迭代的顺序(即插入顺序)。具有以下特点:

  • key和value都允许null
  • key重复会覆盖,value 允许重复
  • 按照元素插入顺序存储
  • 非线程安全

# LinkedHashMap要点

LinkedHashMap通过维护一对LinkedHashMap.Entry<K,V>类型的头尾指针,以双链表形式,保存所有数据。

public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V> {

    // 双链表的头指针
    transient LinkedHashMap.Entry<K,V> head;
    // 双链表的尾指针
    transient LinkedHashMap.Entry<K,V> tail;
    // 迭代排序方法:true 表示访问顺序;false 表示插入顺序
    final boolean accessOrder;
}

由于是链表的形式,所以数据结构是有序的。

# 构造方法

由于LinkedHashMap是继承的HashMap,他都构造方法都是使用的父类的构造方法。

    public LinkedHashMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
        accessOrder = false;
    }

	public LinkedHashMap(int initialCapacity) {
        super(initialCapacity);
        accessOrder = false;
    }

	public LinkedHashMap() {
        super();
        accessOrder = false;
    }

	public LinkedHashMap(Map<? extends K, ? extends V> m) {
        super();
        accessOrder = false;
        putMapEntries(m, false);
    }

    public LinkedHashMap(int initialCapacity,
                         float loadFactor,
                         boolean accessOrder) {
        super(initialCapacity, loadFactor);
        this.accessOrder = accessOrder;
    }

# get方法

LinkedHashMap的get方法和HashMap的get方式类似,都会去调用getNode方法。

	public V get(Object key) {
        Node<K,V> e;
        if ((e = getNode(hash(key), key)) == null)
            return null;
        if (accessOrder)
            afterNodeAccess(e);
        return e.value;
    }

# newNode方法

该方法类似于在链表最后节点处添加新节点。

    Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
        LinkedHashMap.Entry<K,V> p =
            new LinkedHashMap.Entry<K,V>(hash, key, value, e);
        linkNodeLast(p);
        return p;
    }

    private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
        LinkedHashMap.Entry<K,V> last = tail;
        tail = p;
        if (last == null)
            head = p;
        else {
            // 双向
            p.before = last;
            last.after = p;
        }
    }

# containsValue

通过遍历LinkedHashMap.Entry<K,V>,查找双向链表中是否存在指定值。

public boolean containsValue(Object value) {
        for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after) {
            V v = e.value;
            if (v == value || (value != null && value.equals(v)))
                return true;
        }
        return false;
    }

# 参考

Java容器之Map (opens new window)

#Java
上次更新: 2024/06/29, 15:13:44
Java集合-HashMap
Java集合-ConcurrentHashMap

← Java集合-HashMap Java集合-ConcurrentHashMap→

最近更新
01
基础概念
10-31
02
Pytorch
10-30
03
Numpy
10-30
更多文章>
Theme by Vdoing | Copyright © 2021-2024 旭日 | 蜀ICP备2021000788号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式