深入理解HashMap和LinkedHashMap的区别

深入理解HashMap和LinkedHashMap的区别文章目录简介 LinkedHashMa 详解插入访问 removeEldest 总结深入理解 HashMap 和 LinkedHashMa 的区别简介我们知道 HashMap 的变量顺序是不可预测的 这意味着便利的输出顺序并不一定和 HashMap 的插入顺序是一致的 这个特性通常会对我们的工作造成一定的困扰 为了实现这个功能 我们可以使用 LinkedHashMa LinkedHashMa 详解

深入理解HashMap和LinkedHashMap的区别

简介

我们知道HashMap的变量顺序是不可预测的,这意味着便利的输出顺序并不一定和HashMap的插入顺序是一致的。这个特性通常会对我们的工作造成一定的困扰。为了实现这个功能,我们可以使用LinkedHashMap。

LinkedHashMap详解

先看下LinkedHashMap的定义:

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

LinkedHashMap继承自HashMap,所以HashMap的所有功能在LinkedHashMap都可以用。

LinkedHashMap和HashMap的区别就是新创建了一个Entry:

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

这个Entry继承自HashMap.Node,多了一个before,after来实现Node之间的连接。

通过这个新创建的Entry,就可以保证遍历的顺序和插入的顺序一致。

插入

下面看一个LinkedHashMap插入的例子:

 @Test public void insertOrder(){ 
     LinkedHashMap<String, String> map = new LinkedHashMap<>(); map.put("ddd","desk"); map.put("aaa","ask"); map.put("ccc","check"); map.keySet().forEach(System.out::println); } 

输出结果:

ddd aaa ccc 

可以看到输出结果和插入结果是一致的。

访问

除了遍历的顺序,LinkedHashMap还有一个非常有特色的访问顺序。

我们再看一个LinkedHashMap的构造函数:

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

前面的两个参数initialCapacity,loadFactor我们之前已经讲过了,现在看最后一个参数accessOrder。

当accessOrder设置成为true的时候,就开启了 access-order。

access order的意思是,将对象安装最老访问到最新访问的顺序排序。我们看个例子:

 @Test public void accessOrder(){ 
     LinkedHashMap<String, String> map = new LinkedHashMap<>(16, .75f, true); map.put("ddd","desk"); map.put("aaa","ask"); map.put("ccc","check"); map.keySet().forEach(System.out::println); map.get("aaa"); map.keySet().forEach(System.out::println); } 

输出结果:

ddd aaa ccc ddd ccc aaa 

我们看到,因为访问了一次“aaa“,从而导致遍历的时候排到了最后。

removeEldestEntry

最后我们看一下LinkedHashMap的一个特别的功能removeEldestEntry。这个方法是干什么的呢?

通过重新removeEldestEntry方法,可以让LinkedHashMap保存特定数目的Entry,通常用在LinkedHashMap用作缓存的情况。

removeEldestEntry将会删除最老的Entry,保留最新的。

ublic class CustLinkedHashMap<K, V> extends LinkedHashMap<K, V> { 
     private static final int MAX_ENTRIES = 10; public CustLinkedHashMap( int initialCapacity, float loadFactor, boolean accessOrder) { 
     super(initialCapacity, loadFactor, accessOrder); } @Override protected boolean removeEldestEntry(Map.Entry eldest) { 
     return size() > MAX_ENTRIES; } } 

看上面的一个自定义的例子,上面的例子我们创建了一个保留10个Entry节点的LinkedHashMap。

总结

LinkedHashMap继承自HashMap,同时提供了两个非常有用的功能。

本文的例子https://github.com/ddean2009/learn-java-collections

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231673.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分布式系统下的纠删码技术(一) — Erasure Code (EC)

    分布式系统下的纠删码技术(一) — Erasure Code (EC) 近几个月主要参与一个分布式存储系统的纠删码部分(用于数据容错),纠删码在学术界出现比较早,现在ceph,微软的存储系统,Hadoop3.0等都用了EC。文章会分为多篇,主要将ErasureCode,LRC, 以及相关的数学基础,作为学习总结。 一、纠删码简介      分布式系统需要在硬件失效等故障发生后仍然能继续提供服务。就数据而言,HDFS采用每份数据3副本的方式,保…

    2025年7月2日
    4
  • jmeter ip欺骗_jmeter支持的协议

    jmeter ip欺骗_jmeter支持的协议由于服务器出于安全考虑会对同一IP地址做过滤,所以如果想要达到正常的压测效果,我们需要在发请求时伪造出不同的IP地址。主要步骤分为以下3步:第一步:在负载机上绑定IP地址。第二步:在要欺骗的http请求中,修改Implementation为httpclient模式。第三步:在要欺骗的http请求中,修改SourceIPAddress,指定请求要用到的本地地址(参数化)。首先打开负载机上的

    2025年6月1日
    4
  • PhpStorm 2021.40.6激活码_通用破解码

    PhpStorm 2021.40.6激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    51
  • pycharm配置python运行环境_C中调用Python

    pycharm配置python运行环境_C中调用Python目录前言一、系统路径说明二、环境配置1.在VS中选择ReleaseX642.菜单栏中选择:项目->属性3.生成dll答疑python程序目录下没有Numpy路径?具体代码参考博客前言本文主要讲解在Python程序中调用C(C++)程序的方法。主要思路是:在VS中配置好环境后,将C语言程序打包生成动态库文件.dll。将.dll改名成.pyd之后,装入相应路径,在pycharm中直接import即可环境:win10Pycharm(python3.6)(64位)VS2017(社区版)

    2022年8月26日
    8
  • 【实例分割】1、SOLOv1: Segmenting Objects by Locations_2019[通俗易懂]

    【实例分割】1、SOLOv1: Segmenting Objects by Locations_2019[通俗易懂]文章目录一、背景二、本文方法三、本文方法的具体做法3.1问题定义3.1.1Semanticcategory3.1.2InstanceMask3.2NetworkArchitecture3.3SOLOlearning3.3.1LabelAssignment3.3.2LossFunction3.4Inference四、实验4.1主要结果4.2HowSOLOwork……

    2022年8月23日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号