`

LinkedHashMap理解

阅读更多

注: 下面的源码理解均基于jdk1.8的源码

 

   HashMap是常用的数据集合,但是是无序, LinkedHashMap就是在HashMap上进行的一种扩展,在HashMap特性的基础上增加了有序这个特性(还可以根据最新使用自动排序)设计十分巧妙

 

   1 LinkedHashMap继承自HashMap

    

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

   2 LinkedHashMap 每个节点Node

    

    static class Entry<K,V> extends HashMap.Node<K,V> {
        Entry<K,V> before, after;
        Entry(int hash, K key, V value, Node<K,V> next) {
            super(hash, key, value, next);
        }
    }

    LinkedHashMap 的node继承了HashMap的node,在原来的基础上增加了before和after引用,实现了双向链表

 

   3 LinkedHashMap 存储结构还是HashMap的数组,每个node通过链表链接,LinkedHashMap 并没有重新put方法,而是在newNode()方法,与HashMap不同的是在HashMap新加节点的基础上(给数组index对应的赋值),设置了after,before引用,形成了链表

 

   

    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;
    }

 

 

   4 LinkedHashMap  get方法进行了重新,不过在不使用accessOrder的时候实现还是HashMap的实现,直接使用hash获取index

    

    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;
    }

  

 

  5 遍历LinkedHashMap  jdk1.8提供的forEach是直接遍历链表,1.8之前的写法entrySet()进行遍历, LinkedHashMap 重写了entrySet()方法

   

    public Set<Map.Entry<K,V>> entrySet() {
        Set<Map.Entry<K,V>> es;
        return (es = entrySet) == null ? (entrySet = new LinkedEntrySet()) : es;
    }

   返回的是一个有序的LinkedEntrySet,确保返回的数据是有序的

 

 

   总结: 感觉linkedHashMap的扩展做的很巧妙,既不失HashMap的特性,有巧妙的扩展出了新特性,这也是我们自己代码设计可以借鉴的地方

 

 

分享到:
评论

相关推荐

    LinkedHashmap的使用

    **HashMap与LinkedHashMap的区别** HashMap是Java集合框架中的一员,它是基于哈希表实现的,提供了快速的插入、删除和查找操作,平均时间...在理解和使用时,需要注意其内部结构和排序方式,以便更好地利用其特性。

    LinkedHashMap

    理解和掌握`LinkedHashMap`可以帮助开发者在处理需要有序Map的场景时做出明智的选择,优化程序的效率和逻辑。在实际编程中,应根据需求选择是否使用`accessOrder`属性,以便在插入顺序和访问顺序之间进行权衡。

    java HashMap,TreeMap与LinkedHashMap的详解

    在Java编程语言中,`HashMap`、`TreeMap`和`LinkedHashMap`都是`java.util.Map`接口的实现,它们提供了不同的数据存储和访问策略。本文将深入探讨这三种数据结构的特点、工作原理以及适用场景。 1. **HashMap** `...

    一文搞懂Java的LinkedHashMap.docx

    《深入解析Java的LinkedHashMap》 HashMap作为Java中常用的键值对存储结构,以其高效的查找速度赢得了广大开发者们的...在理解HashMap的基础上,深入学习LinkedHashMap的内部机制,能够更好地应对各种数据结构的需求。

    JavaLinkedHashMap源码解析Java开发Ja

    Java LinkedHashMap 是一个根据插入顺序...通过深入理解 `LinkedHashMap` 的源码,开发者可以更好地优化程序性能,尤其是在处理大量数据和需要特定顺序的场景下。同时,对于提升 Java 开发技巧和经验也是大有裨益的。

    详解Java中LinkedHashMap

    LinkedHashMap的基本实现思想是多态,可以说,理解多态再去理解LinkedHashMap原理会事半功倍。 在LinkedHashMap中,每个元素是一个Entry对象,Entry对象中包含了Key、Value、Hash值、之前的Entry对象和之后的Entry...

    Java LinkedHashMap工作原理及实现

     在理解了#7 介绍的HashMap后,我们来学习LinkedHashMap的工作原理及实现。首先还是类似的,我们写一个简单的LinkedHashMap的程序:  LinkedHashMap&lt;String&gt; lmap = new LinkedHashMap();  lmap.put(语文, 1)...

    HashMap遍历

    这种方法简单直观,易于理解。以下是一个典型的使用`keySet()`遍历`HashMap`的例子: ```java Map, String&gt; map = new HashMap(); for (int i = 0; i ; i++) { map.put("key" + i, "value" + i); } Iterator...

    LonelyInteger-LinkedHashMap

    通过阅读和理解这个项目的源代码,我们可以学习到如何在实际编程问题中有效地利用`LinkedHashMap`,以及如何设计和实现算法来解决特定问题。同时,这也是一个很好的机会去了解单元测试和代码组织的最佳实践。

    LinkedHashMap-java

    `LinkedHashMap`是Java编程语言中`java.util`包下的一个接口实现类,它是`HashMap`的一个子类,继承自`AbstractMap`并实现了`Map`接口。...理解它的工作原理和适用场景,有助于在编程时做出更恰当的选择。

    今天会是有Offer的一天么:面试时不要再问我LinkedHashMap了

    **LinkedHashMap概述** LinkedHashMap是Java集合框架中的一员,它是HashMap的一个子类,同时结合了...在面试或实际开发中,理解LinkedHashMap的工作原理和特点,对于优化数据结构的使用和提升代码质量具有重要意义。

    实现 LRU 算法,和 Caffeine 和 Redis 中的缓存淘汰策略.docx

    LRU (Least Recently Used) 算法是一种常用的缓存淘汰策略,它的核心思想是优先淘汰...在 Java 中,`LinkedHashMap` 是实现 LRU 缓存的一种高效方式,但也需要理解其内部机制,以便在面试或特定场景下进行自定义实现。

    hashmap:提供快速的HashMap,LinkedHashMap和高阶函数到任何可迭代的函数,例如Array,Map或Set。 经过测试和基准测试的问题和PR

    选择集合时,值得理解您要解决的问题。 少量条目的本将显着提高速度。 但是,一旦地图达到1,000或更多,Mootable Hashmap就会真正显示出其优势。 为此,它将利用更多的内存。 如果通过JIT编译之类的操作在循环...

    Java基础学习24.pdf

    Java编程语言的基础学习是成为Java开发者的必要步骤,其中对数据结构的理解至关重要,特别是Map接口的实现类。本文将深入探讨Java中Map的几个重要子类:LinkedHashMap和TreeMap,以及Set接口的相关实现。 首先,Map...

    Activity 间intent传递有序排序的map集合

    理解这个知识点对于优化应用的数据传输流程至关重要。 首先,Map接口在Java中提供了若干实现类,如HashMap、LinkedHashMap等。HashMap是无序的,而LinkedHashMap则保持了插入顺序或者按照访问顺序排序。在Intent中...

    java面试题-应届生面试题-面试大全

    - **Map接口**:熟悉HashMap、TreeMap、LinkedHashMap的区别,理解键值对的概念。 - **泛型**:理解泛型的基本概念,知道如何定义泛型类、泛型方法和泛型通配符。 4. **多线程** - **线程创建**:掌握通过Thread...

    深入Java集合学习系列

    在"深入Java集合学习系列(四):LinkedHashMap的实现原理_尚硅谷_张晓飞.pdf"中,你将深入理解LinkedHashMap的内部双向链表结构及其与HashMap的区别。 总结起来,这个学习系列将帮助你全面理解Java集合框架中的...

    自定义实现常用数据结构 -java版代码.rar

    6. **LinkedHashMap的链接机制**:理解双向链表的结构和插入、删除节点的逻辑。 7. **访问顺序和插入顺序**:观察LinkedHashMap如何根据访问顺序更新元素的位置。 通过深入学习这些源码,不仅可以帮助我们理解数据...

    LRU.rar_LRU_LRU ja

    通过分析`LRU.java`,我们可以学习如何在实际项目中应用LRU缓存策略,理解如何利用`LinkedHashMap`实现高效的缓存管理,并了解LRU算法的工作机制。此外,还可以学习到如何处理内存限制下的数据存储问题,这对优化...

Global site tag (gtag.js) - Google Analytics