Java中的LinkedHashMap

介绍:

LinkedHashMap是一个Map实现,它维护其元素的插入顺序。 它扩展了HashMap类:

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

就像HashMap一样 ,它允许存储一个null键和许多null值。

实例化

我们可以使用以下构造函数之一来创建LinkedHashMap

LinkedHashMap() //default capacity 16 with load factor of 0.75
 
LinkedHashMap(Map<? extends K,? extends V> map)
 
LinkedHashMap(int initialCapacity)
 
LinkedHashMap(int initialCapacity, float loadFactor)
 
LinkedHashMap(int initialCapacity, float loadFactor
  , boolean accessOrder)

最后一个构造函数还接受布尔参数accessOrder

当我们将true传递给accessOrder时,我们将实例化一个访问顺序LinkedHashMap 访问顺序LinkedHashMap维护从最近使用到最近使用的元素的访问顺序,而不是插入顺序。

我们可以将Java LinkedHashMap分为两个主要类别:

1.插入顺序

除非另有说明,否则LinkedHashMap会维护其元素的插入顺序。 我们可以将其命名为插入顺序LinkedHashMap

让我们看一个例子:

@Test
public void insertionOrderLinkedHashMap() {
 
    LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
    map.put(1, "A");
    map.put(2, "B");
    map.put(3, "C");
   
    assertEquals("[1, 2, 3]", map.keySet().toString());
  
    map.get(2); // accessing element
 
    assertEquals("[1, 2, 3]", map.keySet().toString()); //still maintains insertion order
    
}

2.访问顺序

当我们使用构造函数: LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder)并将真实值传递给accessOrder参数时,我们将获得一个访问顺序LinkedHashMap

让我们看看访问顺序LinkedHashMap的实际工作原理:

@Test
public void accessOrderLinkedHashMap() {
 
    LinkedHashMap<Integer, String> map = new LinkedHashMap<>(16, 0.75f, true);
    map.put(1, "A");
    map.put(2, "B");
    map.put(3, "C");
   
    assertEquals("[1, 2, 3]", map.keySet().toString());
  
    map.get(2); // accessing element
 
    assertEquals("[1, 3, 2]", map.keySet().toString());
    
}

在使用键2作为元素访问元素时,它移到了最后一个位置。 显然, 根据从最近到最近的访问顺序对元素进行排序。

常用方法:

让我们探索流行的方法:

  1. V put(K键,V值):HashMap类继承此方法。 它存储给定的键值对。 如果键已经存在,则更新值
  2. void replaceAll(BiFunction <?super K,?super V,?extended V> function):用该条目上调用函数的结果替换每个条目的值,直到所有条目都已处理或该函数引发异常
  3. boolean containsKey(Object key):检查给定键是否存在
  4. boolean containsValue(Object value):如果至少有一个具有该值的键,则返回true
  5. V get(Object key):根据键检索值
  6. V getOrDefault(Object key,V defaultValue):如果键存在,则返回映射值,否则返回默认值
  7. void clear():删除所有元素
  8. Set <Map.Entry <K,V >> entrySet():返回给定地图中映射的Set视图
  9. Set <K> keySet():返回地图中包含的键的Set视图
  10. Collection <V> values():返回包含在映射中的值的Collection视图
  11. forEach(BiConsumer <?super K,?super V> action):对给定映射中的每个条目执行给定操作,直到处理完所有条目或引发异常
  12. protected boolean removeEldestEntry(Map.Entry <K <V> eldest) :如果地图应删除其最旧的条目,则此方法将返回true

现在让我们尝试以下几种方法:

Map<Integer, String> map = new LinkedHashMap<>();
 
map.put(1, "A");
map.put(2, "B");
 
map.forEach((k, v) -> System.out.println(k + ":" + v));
 
System.out.println(map.size());
 
System.out.println(map.containsKey(1));
 
System.out.println(map.get(1));
 
map.remove(1);
 
for(Map.Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("Key=" + entry.getKey() + ", Value=" + entry.getValue());
}

结论:

在这篇快速文章中,我们研究了LinkedHashMap是什么以及如何实例化和使用它。

成为第一个发表评论的人。

翻译自: https://www.javacodegeeks.com/2019/05/linkedhashmap-java.html

Java中的LinkedHashMap是什么?深入解析与应用指南 通过哈希表+双向链表的混合结构,在高效查找的同时维护元素顺序,是Java后端开发中解决特定场景问题的利器。理解其设计思想后,可灵活应用于缓存、日志记录等需求。建议结合源码(如Entry节点的before和after指针)深入掌握其实现细节。扩展思考:如何结合与弱引用(WeakReference)实现内存敏感的缓存?欢迎在评论区讨论!关注我,获取更多Java学习和开发干货!💡如需完整代码或进一步探讨,欢迎在评论区留言或访问我的CSDN博客!作为Java开发者,持续输出技术总结是提升能力的关键。 阅读详情

相关推荐

JavaLinkedHashMap

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。LinkedHashMapMap接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变,LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。

pleaseprintf的博客 428

Java集合之LinkedHashMap

第一张图为LinkedHashMap整体结构图,第二张图专门把循环双向链表抽取出来,直观一点,注意该循环双向链表的头部存放的是最久访问的节点或最先插入的节点,尾部为最近访问的或最近插入的节点,迭代器遍历方向是从链表的头部开始到链表尾部结束,在链表尾部有一个空的header节点,该节点不存放key-value内容,为LinkedHashMap类的成员属性,循环双向链表的入口。每次访问都把访问的那个数据移到双向队列的尾部去,那么每次要淘汰数据的时候,双向队列最头的那个数据不就是最不常访问的那个数据了吗?

woaimx_1314的博客 4586

Java基础 LinkedHashMap

LinkedHashMap是HashMap和双向链表的合二为一,即一个将所有Entry节点链入一个双向链表的HashMapLinkedHashMap = HashMap + 双向链表)LinkedHashMap和HashMapJava Collection Framework 的重要成员,也是Map族(如下图所示)LinkedHashMap是HashMap的子类(拥有HashMap的所有特性)

深入Java世界:探索编程之美与技术深度 1694

javaLinkedHashMap详解

LinkedHashMap源码的简单解析

三木易的博客 2920

Java 集合】LinkedHashMap

LinkedHashMap 是基于 HashMap 的实现的, 所以整体的结构是类似的, 唯一不同的是: 链表和红黑树的节点多维持了一个前驱节点指针和后驱节点指针。简单的理解就是 HashMap + 双向链表。因为继承了 HashMap, 直接复用父级 HashMap 的 table 属性, 存储的数据类型依旧是 Node// 继承 HashMap Node 节点的基础上, 追加了一个前驱指针和后驱指针。

LCN29的博客 2496

LinkedHashMap介绍和使用

LinkedHashMapJava中的一种特殊类型的HashMap,它继承自HashMap并实现了Map接口。与普通的HashMap不同,LinkedHashMap在内部使用**双向链表**维护了插入顺序或者访问顺序,故而保证元素的顺序。 LinkedHashMap的主要用途是在需要保持元素顺序的场景中使用,它可以用来实现LRU(least Recently Used ,最近很少使用) 缓存,通俗的讲就是根据元素的访问顺序进行缓存淘汰,当然,linkedHashMap还可以用于实现有序的映射表,保持元素

好看的皮囊千篇一律,有趣的灵魂万里挑一。 3748

Java 中的 LinkedHashMap

应用:由于 LinkedHashMap 使用双向链接列表来维护插入顺序,我们可以通过重写removeEldestEntry()方法来实现 LRU 缓存功能,以实施在将新映射添加到映射时自动删除过时映射的策略。HashMap 具有快速插入、搜索和删除的优势,但它从不维护插入的轨迹和顺序,而 LinkedHashMap 则提供了可以按插入顺序访问元素的功能。由于 LinkedHashMap 中的元素是使用键进行索引的,因此只需重新插入我们希望更改的键的更新值即可更改键的值。因此,该参数是数据的键。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1026

Java 中的 LinkedHashMap 是什么?

LinkedHashMap 在 HashMap 基础上通过双向链表维护顺序,支持插入顺序和访问顺序两种模式。它的核心价值在于平衡哈希表的高效性和链表的有序性,常用于实现 LRU 缓存或需要保留操作顺序的场景。方法可自动淘汰旧数据。相比 TreeMap,它在顺序无关的查找场景下性能更优,但比 HashMap 略慢于增删操作。:LinkedHashMap 在 JDK 中的实际应用?:如何优化 LinkedHashMap 的内存占用?:如何实现线程安全的 LinkedHashMap?的子类,在哈希表的基础上。

2302_81141145的博客 410

java的stream返回Linkedhashmap

我整理的一些关于【Java,HA】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/f2PFnN使用Java Stream返回LinkedHashMap的全攻略 在Java中,Stream API是一个强大的工具,它让我们以函数式的风格处理集合。通过Stream API,我们可...

weixin_40765217的博客 468

java linkedhashmap_Java LinkedHashMap

Java中的LinkedHashMap (LinkedHashMap in Java)It’s part of Java Collections Framework. 它是Java Collections Framework的一部分。 LinkedHashMap is the hash table and linked list implementation of the Map interfac...

weixin_36084686的博客 218

linkedhashmap java_Java LinkedHashMap

Java LinkedHashMap类扩展HashMap类并按照插入顺序维护映射中条目的链接列表。这允许在映射上进行插入顺序迭代。也就是说,在迭代LinkedHashMap时,元素将按插入顺序返回。还可以创建一个LinkedHashMap对象,它按照上次访问的顺序返回元素。以下是LinkedHashMap类支持的构造函数列表。编号构造函数描述1LinkedHashMap()此构造函数构造默认的Li...

weixin_42119989的博客 182

Java面试必备:Java 中的 LinkedHashMap 详解

LinkedHashMapJava 集合框架中的一个重要类,它继承自 HashMap,同时维护了一个双向链表来记录插入顺序或访问顺序。这意味着它不仅具有 HashMap 的高效查找特性,还能保持元素的顺序。

qq_58299462的博客 926

linkedhashmap遍历_Java集合:浅谈LinkedHashMapLinkedHashSet源码及LRU算法实现

Java的HashSet、HashMap集合应用及底层原理,相信大家都已经很熟悉了,这里就不再赘述了。这里主要来介绍下如何Java中的LinkedHashMap集合,同时也介绍下基于LinkedHashMapLinkedHashSet集合、LRU算法实现LinkedHashMap插入顺序遍历LinkedHashMap集合是基于HashMap实现的,所以它具有HashMap的特性。但是我们在使用H...

weixin_39780962的博客 1167

Java LinkedHashMap 原理

Java LinkedHashMap 原理 LinkedHashMap是基于哈希算法,以键值对的形式存储和操作数据的非线程安全容器,继承于HashMap,在HashMap的基础上增加了双链表来支持插入顺序遍历,除此之外对操作顺序遍历也提供了支持,可用于实现LRU缓存 操作性能也保证了O(1),根据操作顺序排列可以用于实现LRU缓存 与HashMap相比在无哈希冲突情况下时间复杂度也能达到O(1),...

提辖鲁的博客 735

Java LinkedHashMap

Java LinkedHashMap前言Map是我们在实际使用过程中常用的集合,HashMapJava的实际开发中出镜率很高,它通过hash算法实现了高效的非线程安全的集合,它有一个缺点就是,用户插入集合的数据时无序,在我们需要一些有序的map的时候,我们就需要引入另外一个集合:LinkedHashMapLinkedHashMap是一个有序的非线程安全的集合,它是HashMap的子类,基本特

joniers的博客 993
上一篇: java ee 7 新_Java EE 7:新功能???
下一篇: Java中的中介器设计模式
dnc8371
博客等级 码龄11年 421粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值