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

}

运行结果:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LinkedHashMapJava的一个类,它继承自HashMap,并且在HashMap的基础上增加了维护插入顺序的功能。\[1\]LinkedHashMap内部使用一个双向链表来维护插入顺序,这样可以保证遍历LinkedHashMap时的顺序与插入顺序一致。\[2\]在LinkedHashMap,每个Entry节点都包含了before和after指针,用来维护节点的先后顺序。当一个Entry被访问时,它会被移动到链表的尾部,以保证最近访问的Entry在链表的尾部。这个特性使得LinkedHashMap非常适合用于实现LRU缓存。\[2\] 在使用LinkedHashMap时,可以通过构造函数来指定初始容量、负载因子和访问顺序。如果访问顺序设置为true,那么当一个Entry被访问时,它会被移动到链表的尾部,以保证最近访问的Entry在链表的尾部。如果访问顺序设置为false,那么遍历LinkedHashMap时的顺序将会是插入顺序。\[3\] 总结来说,LinkedHashMap是一个继承自HashMap的类,它在HashMap的基础上增加了维护插入顺序的功能。通过使用双向链表来维护插入顺序,可以保证遍历LinkedHashMap时的顺序与插入顺序一致。这个特性使得LinkedHashMap在实现LRU缓存等场景非常有用。 #### 引用[.reference_title] - *1* *2* *3* [java.util.LinkedHashMap源码解析](https://blog.csdn.net/m0_37876631/article/details/100598133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值