• LinkedHashMap


    ##### LinkedHashMap

      LinkedHashMap此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接

      列表。存储的数据是有序的【添加顺序】

      

      public class LinkedHashMap extends HashMap implements Map

      

      内部类

       static class Entry extends HashMap.Node {

            Entry before, after;

            Entry(int hash, K key, V value, Node next) {

                super(hash, key, value, next);

            }

        }

      

      HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了

      

      Map map=new LinkedHashMap();

      Random r=new Random();

      for(int i=0;i<10;i++)

       map.put(r.nextInt(100), i+"-value");

      System.out.println(map);

       实际上是调用map.entrySet对数据进行遍历,生成String

      

      特殊新增的构造器

      

      new LinkedHashMap<>(16, 0.75f, true)

      LinkedHashMap存储数据是有序的(默认false,其中使用before/after记录了插入顺序)

    public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {

       super(initialCapacity, loadFactor);

       this.accessOrder = accessOrder;

    }

    accessOrder涉及到LinkedHashMap存储的顺序,具体的存储顺序分为两种:插入顺序(false)和

    访问顺序(true调用get方法会导致位置的移动)。accessOrder设为false表示插入顺序存储的,

    这也是默认值,表示LinkedHashMap中存储的顺序是按照调用put方法插入的顺序进行排序的。

    设置采用访问顺序

    如果一个key被访问过了的元素则自动添加到默认位置的末尾。如果不进行访问操作,则为插入顺序一致

    Map map=new LinkedHashMap<>(10,0.75f,true);

    Random r=new Random();

    map.put(111,"value");

    for(int i=0;i<10;i++) map.put(r.nextInt(100), i+"value");

    map.get(111);

    //约瑟夫环的最佳写法

    如果true采用访问顺序,而111对应的数据被访问过后自动自动到末尾;如果false则位置永远不变

    ###### 总结

    - LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。

    - HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序那put和get

    操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)

    - LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序

    - LinkedHashMap是线程不安全的

     /

    public class TestLinkedHashMap {

    public static void main(String[] args) {

    Map map = new LinkedHashMap<>(10, 0.75f, true);

    Random r = new Random();

    map.put(111, "value");

    int kk = 0;

    for (int i = 0; i < 10; i++) {

    kk=r.nextInt(100);

    map.put(kk, i + "value");

    }

    map.get(kk);

    map.get(111);

    System.out.println(map);

    }

    }

  • 相关阅读:
    物联网浏览器(IoTBrowser)-基于计算机视觉开发的应用“智慧眼AIEye”
    pytorch 模型GPU推理时间探讨3——正确计算模型推理时间
    Windows如何删除“$WINDOWS.~BT“文件夹,解决权限不足无法删除
    嵌入式烧录报错:板端IP与PC的IP相同
    【EMQX 5.0】2.4.2 前端集成--MQTT.js
    此文带你详细了解MySQL数据库的存储引擎知识
    JavaScript基础: 异步
    Postman、Apifox、Apipost用哪个?
    ubunu中配置torch环境4060显卡
    Linux操作
  • 原文地址:https://blog.csdn.net/zjh0101/article/details/126670694