JAVA 中的LinkedHashMap 使用场景

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
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. Entry;
/**
 * 这里稍微理清一下LinkedHashMap 对于访问排序的原理:
 *
 * 当我们指定了按访问的顺序进行排序的时候,那么这个时候LinkedHashMap 会这样来处理,就是
 * 移除当前的这个key,然后将这个key 放到最后,以此来实现访问的顺序。所以说如果最后一次访问的元素
 * 他总是在链表中的末尾。为什么他要基于HashMap 来实现这么一个链表呢?那是因为基于他的查找因素很快,然后直接
 * 移除,并将它添加到末尾。它相比与传统的LinkedList的不同就在于他查找所要移除的元素比较快,而LinkedList
 * 要是移除宇哥元素的话还要一次遍历这个链表然后在做移除的操作。所以如果以后还想要使用ArrayList或者LinkedList
 * 来存储数据的话,不妨做好改用LinkedHashMap,它不仅提供了类似于ArrayList 基于角标查询的速度,又有LinkedList
 * 快速删除的特点。此外他还有一个更强大的功能就是可以基于访问的次序进行排序。即最后一次访问的元素总是放于最后的。对访问的频率
 * 不做影响。
 *
 *
 *
 * @author Administrator
 *
 */
public class LinkedHashMapTest {

      /**
      * @param args
      */
      public static void main(String [] args) {
           // TODO Auto-generated method stub
           LinkedHashMap<String, String> lm =
                    new LinkedHashMap<String,String>( 16, 0. 75f,true);
          
          lm .put("key-1", "val-1");
          lm .put("key-2", "val-2");
          lm .put("key-3", "val-3");
          lm .put("key-4", "val-4");
          
          
           for( Entry<String, String> entry: lm.entrySet()){
              
                System.out.println( entry.getKey()+"--"+ entry.getValue());
           }
          lm .get("key-3");
          lm .get("key-3");
          lm .get("key-2");
           System.out.println("---------------");
           for( Entry<String, String> entry: lm.entrySet()){
              
                System.out.println( entry.getKey()+"--"+ entry.getValue());
           }
          
           Iterator<String> keyIt = lm.keySet().iterator();
          
           List<String> targetkeys = new ArrayList<String>();
          
           while( keyIt.hasNext()){
               String key = keyIt.next();
              
               /**
               * 这里会抛出异常,那是因为当你在迭代key 时他要保证key 的同步关系,即key 在集合中的顺序
               * 是不能发生改变的。因此在一开始迭代时,他会给这个路口上一个锁,来标识当前我在迭代key,如果
               * 有其他操作想更改key的顺序,我是不允许的。那么在迭代key 时还有什么意思和相关的应用场景呢?
               * 如果仅仅是想过的我们想要的key,然后再去取值操作,那为什么不直接使用HashMap提供的get(key)
               * 方法来去呢?这个时候我目前想到的一个应用场景就是:
               * 当这个集合中的数据不是有我们所管理的时候,我们仅仅是由读取的权限,那么这个时候我们就可以使用便利
               * key的方法来处理我们想要的操作。比如说底层处理好的操作给我们传一个LinkedHashMap,然后我们就可以对我们
               * 感兴趣的key进行相关的操作。
               */
               if( key.equals("key-2") || key.equals("key-3"))
               targetkeys.add( key);
           }
          
           //然后再在这里做相关的处理
           for(String key : targetkeys){
              
               System.out.println( lm.get( key));
           }
      }

}

运行结果:


054_TreeMap / LinkedHashMap TreeMap和LinkedHashMapJava中Map接口的两种重要实现,分别提供排序和顺序保留功能。TreeMap基于红黑树实现,按键排序(自然或定制),增删改查时间复杂度为O(log n),适用于需要排序或导航操作的场景LinkedHashMap基于哈希表+双向链表,保留插入或访问顺序,查询性能O(1),适用于需要记录顺序或实现LRU缓存的场景。两者均非线程安全,允许null值但TreeMap不允许null键。开发者应根据排序需求或顺序保留需求选择合适的实现。 阅读详情

相关推荐

滚雪球学Java(68):全面了解Java中常用的集合类:LinkedHashMap的应用与实践

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

**My Coding Family** 1209

LinkedHashMap

LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。accessOrder涉及到LinkedHashMap存储的顺序,具体的存储顺序分为两种:插入顺序(false)和。HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了。这也是默认值,表示LinkedHashMap存储的顺序是按照调用put方法插入的顺序进行排序的。如果不进行访问操作,则为插入顺序一致。存储的数据是有序的【添加顺序】

zjh0101的博客 1100

深入浅出Java中的数据结构:LinkedHashMap详解

Java编程中,我们经常需要使用Map这个数据结构来存储键值对,而是Map的一个实现类,它在HashMap的基础上维护了一个双向链表,并且按照插入顺序或者访问顺序来迭代元素。既保证了HashMap的快速访问性能,又提供了顺序访问的能力,因此在某些场景下非常有用。本文将从源代码解析、应用场景案例、优缺点分析等多个方面对进行详细介绍,希望能帮助读者更好地理解的实现原理和使用方法。本文主要介绍了Java中的这个数据结构,并对其源代码进行了分析和解读。通过对的应用场景案例和优缺点分析,读者可以更好地理解。

喵手的博客 1270

HashMap、TreeMap和LinkedHashMap分别在什么时候用

HashMap、TreeMap和LinkedHashMap分别在什么时候用。

hallowty的博客 1344

图解LinkedHashMap原理

图解HashMap原理LinkedHashMap继承了HashMap,所以它们有很多相似的地方。LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。

m0_53157173的博客 1330

LinkedHashMap应用场景及例子

LinkedHashMap 通常提供的是遍历顺序符合插入顺序,它的实现是通过为条目(键 值对)维护一个双向链表。注意,通过特定构造函数,我们可以创建反映访问顺序的 实例,所谓的 put、get、compute 等,都算作“访问”。 这种行为适用于一些特定应用场景,例如,我们构建一个空间占用敏感的资源池,希望可 以自动将最不常被访问的对象释放掉,这就可以利用 LinkedHashMap 提供的机制...

qq_36457702的博客 6066

Java中HashMap、LinkedHashMap和TreeMap区别使用场景

1. HashMap中k的值没有顺序,常用来做统计。 2.LinkedHashMap吧。它内部有一个链表,保持Key插入的顺序。迭代的时候,也是按照插入顺序迭代,而且迭代比HashMap快。 3. TreeMap的顺序是Key的自然顺序(如整数从小到大),也可以指定比较函数。但不是插入的顺序。 4.Hashtable与 HashMap类似,它继承自Dictionary类、不同的是:它不允许记...

春华秋实 1万+

Java中HashMap、LinkedHashMap和TreeMap的区别使用场景

HashMap中k的值没有顺序,常用来做统计。 LinkedHashMap吧。它内部有一个链表,保持Key插入的顺序。迭代的时候,也是按照插入顺序迭代,而且迭代比HashMap快。 TreeMap的顺序是Key的自然顺序(如整数从小到大),也可以指定比较函数。但不是插入的顺序。 Hashtable与 HashMap类似,它继承自Dictionary类、不同的是:它不允许记录的键或者...

丸啊~ 582

Java集合篇之Map】HashMap、HashTable、TreeMap、LinkedHashMap的区别以及应用场景

今天我向大家介绍Map接口中常用的四个集合类,先看看这几种实现类的类结构:[java] view plain copypublic class HashMap&lt;K,V&gt; extends AbstractMap&lt;K,V&gt;      implements Map&lt;K,V&gt;, Cloneable, Serializable  [java] view plain cop...

wjn19921104的博客 379

【实战场景java.util.LinkedHashMap cannot be cast to XXXX 问题

mybatisPlus的注解@TableField种指定的typeHandler如果使用 JacksonTypeHandler的话,会默认将数据库json字段映射成List,然后List中便是 LinkedHashMap, 《在使用mybatisPlus读取mysql的表的一个json字段,然后这个json对应的是java list 【List】,转化的时候抛了这个异常!由具体的子类提供List集合泛型类型。》真的是遭重呀~~~~

杰叔叔不是个好叔叔的博客 1091

HashMap 和 LinkedHashMap使用区别——找出你的最佳选择!

HashMap是一种基于哈希表的实现,它允许将键和值存储为一对一的映射。HashMap快速访问:由于使用哈希算法,HashMap在平均情况下具有常数时间复杂度的查找、插入和删除操作(O(1))。无序性HashMap不保证顺序。即使你以某种顺序插入元素,在迭代时也可能会得到不同的顺序。允许 null 值HashMap允许一个空键和多个空值。是HashMap的一个子类,结合了哈希表的高效性和链表的顺序特性。有序性维护了一个双向链表,按照插入的顺序排列元素。当你迭代。

龚小帅的博客 1474

Java 常用数据集合使用场景及特性小结————第三篇(LinkedHashMap

java项目开发中,有一个数据集合叫LinkedHashMap,相信从事java开发的第一位的有所影响或使用过,那么小菜在这里谈一下我对LinkedHashMap的一些小结。 LET'S GO!我们先来看看这些问题,你的知道或了解多少呢!1、什么是Hashtable?2、Hashtable常用的接口方法有那些?3、Hashtable有那些构造方法?4、hash...

qq_28245087的博客 412

HashMap、LinkedHashMap、TreeMap三者的区别

HashMap、LinkedHashMap 和 TreeMap 都是 Java 集合中用于存储键值对的 Map 接口的实现类,本文重点介绍它们在底层数据结构、元素顺序、性能以及使用场景等方面存在的区别。

weixin_46425661的博客 1992

JAVA中HashMap、TreeMap、LinkedHashMap 的用法与注意事项

Map特性HashMapTreeMap顺序保证无序按键自然顺序或自定义顺序保持插入顺序或访问顺序性能O(1)(查找/插入/删除)O(log n)(查找/插入/删除)接近 O(1)(查找/插入/删除)允许null键/值允许一个null键和多个null值不允许null键允许一个null键和多个null值线程安全不安全不安全不安全适用场景高效查询,无需顺序有序数据,范围查询保持插入顺序或访问顺序Java 中的HashMapTreeMap和各有其独特的特性和应用场景

qq_40697623的博客 1016

HashMap、LinkedHashMap和TreeMap:你真的了解它们吗?

本文介绍了HashMap、LinkedHashMap和TreeMap的区别。HashMap是无序的,适用于大多数情况下的键值对存储和检索,性能高效;LinkedHashMap保持插入顺序,适用于需要保持顺序的场景,性能也很好;TreeMap有序存储,适用于需要排序的场景,性能相对较低,但在大数据集合中表现更出色。

孤芳不自赏 511

Java 中的 LinkedHashMap 完全解析:有序哈希表的实现原理与应用场景

fill:#333;important;important;fill:none;fill:none;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;

✨ 欢迎来到【Seal ^_^ 的CSDN博客】!✨ 242
上一篇: 多个线程访问共享变量
下一篇: Eclipse 安装部署 maven 的 web 工程 需要注意的几点问题
得少
博客等级 码龄14年 0粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值