Java 在LinkedHashMap中,当accessOrder为true时,插入顺序是否随重新插入而改变

Java 在LinkedHashMap中,当accessOrder为true时,插入顺序是否随重新插入而改变,java,collections,Java,Collections,在 注1。“如果将一个键重新插入到地图中,插入顺序不受影响。” 注2。提供了一个特殊的构造函数来创建一个链接的哈希映射,其迭代顺序是其条目最后一次访问的顺序,从最近一次访问到最近一次访问(访问顺序) 查询: 重新插入(put方法)是否修改指定条目对象的最近访问,或者只有get方法更改了最近访问 如果在构造LinkedHashMap时accessOrder为true,上面的“注释1”语句是否会冲突,插入顺序是否会受到影响 更新 根据下面的测试代码,put和get方法更改访问顺序。在LinkedHa

注1。“如果将一个键重新插入到地图中,插入顺序不受影响。”

注2。提供了一个特殊的构造函数来创建一个链接的哈希映射,其迭代顺序是其条目最后一次访问的顺序,从最近一次访问到最近一次访问(访问顺序)

查询:

  • 重新插入
    put
    方法)是否修改指定条目对象的最近访问,或者只有
    get
    方法更改了最近访问
  • 如果在构造LinkedHashMap时
    accessOrder
    true
    ,上面的“注释1”语句是否会冲突,插入顺序是否会受到影响
  • 更新

    根据下面的测试代码,
    put
    get
    方法更改访问顺序。在LinkedHashMap构造函数中,注释1显然不正确

     public class Main
     {
        public static void main(String[] args) {
    
            LinkedHashMap<Integer, String> map = new LinkedHashMap<>(16, .75f, true);
            map.put(1, "A");
            map.put(2, "B");
            map.put(3, "C");
            map.put(4, "D");
            map.put(5, "E");
            System.out.println(map);// Output: {1=A, 2=B, 3=C, 4=D, 5=E}
    
            // get method changed access order
            String dummy = map.get(2);
            System.out.println(map);  // Output: {1=A, 3=C, 4=D, 5=E, 2=B}
    
            // put method changed access order
            map.put(1, "Z");
            System.out.println(map);  // Output: {3=C, 4=D, 5=E, 2=B, 1=Z}
        }
     }
    
    公共类主
    {
    公共静态void main(字符串[]args){
    LinkedHashMap=新LinkedHashMap(16.75f,真);
    地图.付诸表决(1,“A”);
    图.put(2,“B”);
    图.put(3,“C”);
    图.put(4,“D”);
    地图.put(5,“E”);
    System.out.println(map);//输出:{1=A,2=B,3=C,4=D,5=E}
    //获取方法已更改访问顺序
    字符串dummy=map.get(2);
    System.out.println(map);//输出:{1=A,3=C,4=D,5=E,2=B}
    //put方法已更改访问顺序
    地图放置(1,“Z”);
    System.out.println(map);//输出:{3=C,4=D,5=E,2=B,1=Z}
    }
    }
    
    通过
    put
    方法重新插入或更新映射时,插入顺序不会更改。根据上述示例,以下两行都将更改访问顺序,但不会更改插入顺序

    map.put(1,"A");
    map.put(1,"Z");
    
    访问顺序,如果
    accessOrder=true
    ,则会根据最近访问的最少最近访问更改为最近访问,即

    {2=B, 3=C, 4=D, 5=E, 1=A}
    {2=B, 3=C, 4=D, 5=E, 1=Z}
    
    但插入顺序仍然相同,可以使用
    accessOrder=false
    打印,即

    {1=A, 2=B, 3=C, 4=D, 5=E}
    

    因此,插入顺序不会随着重新插入而改变,但访问顺序会在LinkedHashMap中发生变化。

    您可以轻松地自行设置一个小的演示代码来测试点#1。使用测试用例进行更新,第二个查询是主要问题,查询1只是对查询2的验证“当accessOrder为true时,插入顺序会随着重新插入而改变吗?”没什么意义。当我们将
    accessOrder
    设置为
    true
    时,我们正在将
    LinkedHashMap
    中所有条目的顺序从插入时更改为访问时。因此,由于使用中没有更多的插入顺序,因此不会受到影响(除非我误解了你的问题)。是的,一开始有点令人困惑,因为
    accessOrder
    true
    我们正在设置新的顺序,而且它不再是按照插入顺序,确切地说,我已经在你们评论之前的回复中发布了。谢谢