java 中 LinkedHashMap使用总结

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

初识LinkedHashMap

上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见、非常有用的集合,并且在多线程情况下使用不当会有线程安全问题。

大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会带来困扰,因为有些场景,我们期待一个有序的Map。

这个时候,LinkedHashMap就闪亮登场了,它虽然增加了时间和空间上的开销,但是通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序

 

四个关注点在LinkedHashMap上的答案

关  注  点 结      论
LinkedHashMap是否允许键值对为空 Key和Value都允许空
LinkedHashMap是否允许重复数据 Key重复会覆盖、Value允许重复
LinkedHashMap是否有序 有序
LinkedHashMap是否线程安全 非线程安全

 

LinkedHashMap基本数据结构

关于LinkedHashMap,先提两点:

1、LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序

2、LinkedHashMap的基本实现思想就是----多态。可以说,理解多态,再去理解LinkedHashMap原理会事半功倍;反之也是,对于LinkedHashMap原理的学习,也可以促进和加深对于多态的理解。

为什么可以这么说,首先看一下,LinkedHashMap的定义:

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

看到,LinkedHashMap是HashMap的子类,自然LinkedHashMap也就继承了HashMap中所有非private的方法。再看一下LinkedHashMap中本身的方法:

看到LinkedHashMap中并没有什么操作数据结构的方法,也就是说LinkedHashMap操作数据结构(比如put一个数据),和HashMap操作数据的方法完全一样,无非就是细节上有一些的不同罢了。

LinkedHashMap和HashMap的区别在于它们的基本数据结构上,看一下LinkedHashMap的基本数据结构,也就是Entry:

复制代码
private static class Entry<K,V> extends HashMap.Entry<K,V> {
    // These fields comprise the doubly linked list used for iteration.
    Entry<K,V> before, after;

Entry(int hash, K key, V value, HashMap.Entry<K,V> next) {
        super(hash, key, value, next);
    }
    ...
}
复制代码

列一下Entry里面有的一些属性吧:

  • K key
  • V value
  • Entry<K, V> next
  • int hash
  • Entry<K, V> before
  • Entry<K, V> after

其中前面四个,也就是红色部分是从HashMap.Entry中继承过来的;后面两个,也就是蓝色部分是LinkedHashMap独有的。不要搞错了next和before、After,next是用于维护HashMap指定table位置上连接的Entry的顺序的,before、After是用于维护Entry插入的先后顺序的

还是用图表示一下,列一下属性而已:

 

初始化LinkedHashMap

假如有这么一段代码:

复制代码
1 public static void main(String[] args)
2 {
3     LinkedHashMap<String, String> linkedHashMap =
4             new LinkedHashMap<String, String>();
LinkedHashMap源码到面试题的全解析 Java提供的一个集合类,它继承自HashMap,并在HashMap支持遍历时会按照插入顺序有序进行迭代。支持按照元素访问顺序排序,适用于封装LRU缓存工具。因为内部使用双向链表维护各个节点,所以遍历时的效率和元素个数成正比,相较于和容量成正比的HashMap来说,迭代效率会高很多。逻辑结构如下图所示,它是在HashMap基础上在各个节点之间维护一条双向链表,使得原本散列在不同bucket上的节点、链表、红黑树有序关联起来。是Java集合框架中HashMap的一个子类,它继承了HashMap 阅读详情

相关推荐

Java集合(七)图解LinkedHashMap原理(源码)

LinkedHashMap继承了HashMap,所以它们有很多相似的地方。

m0_58466443的博客 1526

Java基础 LinkedHashMap

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

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

数据结构之LinkedHashMap

    Map:Map是一个接口,它定义了一些规则,即get和put操作。Map用于保存具有映射关系的数据,因此Map集合中存的是键值对,并且key不能重复     HashMapHashMap是Map接口的一个实现类。HashMap提供所有可选的映射操作,并且允许存null键和null值,它不保证映射的顺序,特别是不保证该顺序永远不发生改变。HashMap的迭代所需的时间和HashMap实例的...

ShadowWalker的博客 3913

LinkedHashMap详解

一、概念及概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。在一些场景下,该特性很有用,比如缓存。在实现上,LinkedHashMap 很多方法直接继承自 HashMap,仅为维护双向链表覆写了部分方法。 当我们希望有顺序地去存储key-value时,就需要使用Linke...

pengjiawei@的专栏 2万+

Java 中的 LinkedHashMap

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

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

Java中的LinkedHashMap

介绍: LinkedHashMap是一个Map实现,它维护其元素的插入顺序。 它扩展了HashMap类: public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 就像HashMap一样 ,它允许存储一个null键和许多null值。 实例化 我们可以使用以下...

最佳 Java 编程 9125

java的stream返回Linkedhashmap

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

weixin_40765217的博客 468

linkedhashmap java_Java LinkedHashMap

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

weixin_42119989的博客 182

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

JavaLinkedHashMap

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

pleaseprintf的博客 428

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

Java的HashSet、HashMap集合应用及底层原理,相信大家都已经很熟悉了,这里就不再赘述了。这里主要来介绍下如何Java中的LinkedHashMap集合,同时也介绍下基于LinkedHashMap的LinkedHashSet集合、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 使用场景

package audaque. com. pbting. collection. test; import java. util. ArrayList; import java. util. Iterator; import java. util. LinkedHashMap; import java. util. List; import java. util. Map. E

pbting的博客 6030

Java LinkedHashMap

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

joniers的博客 993

Java集合之LinkedHashMap

Java集合之LinkedHashMap

tkzc_csk的博客 214

Java LinkedHashMap 深度解析

特性描述数据结构哈希表 + 双向链表元素顺序可维护插入顺序或访问顺序(LRU)性能特征接近 HashMap 的查询性能,略高的内存开销线程安全性非线程安全(同 HashMap)允许 null允许 null 键和 null 值迭代性能迭代效率高于 HashMap(直接遍历链表)@Override// 当值大于1000时移除最老条目。

记录学习的过程 1034

java 遍历linkedhashmap_遍历JavaJava LinkedHashMap的值

Java使用迭代器来迭代LinkedHashMap的值。让我们首先创建LinkedHashMap-LinkedHashMapl=newLinkedHashMap();将一些元素添加到LinkedHashMap-l.put("1","Jack");l.put("2","Tom");l.put("3","Jimmy");l.put("4","Morgan");l.put("5","...

weixin_29690065的博客 2100
上一篇: mac下安装hadoop(一)
下一篇: java map的遍历方法总结
后打开撒打发了
博客等级 码龄17年 376粉丝 337原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值