Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在什么情况下,在HashMap中添加新的键值对时插入顺序会改变?_Java - Fatal编程技术网

Java 在什么情况下,在HashMap中添加新的键值对时插入顺序会改变?

Java 在什么情况下,在HashMap中添加新的键值对时插入顺序会改变?,java,Java,请帮助我了解插入顺序在此处的工作方式 HashMap<Integer, String> hashMap = new HashMap<>(); hashMap.put(1, "Amrendra"); hashMap.put(10, "Joe"); hashMap.put(2, "Aakash"); System.out.

请帮助我了解插入顺序在此处的工作方式

HashMap<Integer, String> hashMap = new HashMap<>();
            hashMap.put(1, "Amrendra");
            hashMap.put(10, "Joe");
            hashMap.put(2, "Aakash");
            System.out.println(hashMap);
            
    LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<>();
            linkedHashMap.put(1, "Amrendra");
            linkedHashMap.put(10, "Joe");
            linkedHashMap.put(2, "Aakash");
            System.out.println(linkedHashMap);
HashMap HashMap=newhashmap();
hashMap.put(1,“Amrendra”);
hashMap.put(10,“Joe”);
hashMap.put(2,“Aakash”);
System.out.println(hashMap);
LinkedHashMap LinkedHashMap=新LinkedHashMap();
linkedHashMap.put(1,“Amrendra”);
linkedHashMap.put(10,“Joe”);
linkedHashMap.put(2,“Aakash”);
System.out.println(linkedHashMap);

HashMap
不维护插入顺序,在使用
迭代器时,您可以观察到,
LinkedHashMap
在迭代时需要额外的内存来维护插入顺序
LinkedHashMap
使用
DoublyLinkedList
来保留顺序,您还可以选择使用
LinkedHashMap
构造函数之一来保留访问顺序(或)插入顺序

访问顺序是最近最少使用的第一个。另一方面,插入顺序的工作方式类似于
FIFO

更新

HashMap<Integer, String> hashMap = new HashMap<>();
hashMap.put(1, "Amrendra");
hashMap.put(10, "Joe");
hashMap.put(2, "Aakash");
hashMap.put(5, "Android");
System.out.println("HashMap: "+hashMap);

hashMap = new LinkedHashMap<>();
hashMap.put(1, "Amrendra");
hashMap.put(10, "Joe");
hashMap.put(2, "Aakash");
hashMap.put(5, "Android");
System.out.println("LinkedHashMap: " + hashMap);
HashMap HashMap=newhashmap();
hashMap.put(1,“Amrendra”);
hashMap.put(10,“Joe”);
hashMap.put(2,“Aakash”);
hashMap.put(5,“安卓”);
System.out.println(“HashMap:+HashMap”);
hashMap=newlinkedhashmap();
hashMap.put(1,“Amrendra”);
hashMap.put(10,“Joe”);
hashMap.put(2,“Aakash”);
hashMap.put(5,“安卓”);
System.out.println(“LinkedHashMap:+hashMap”);
上述截取将产生以下输出


通过输出,您可以清楚地描述在
HashMap
中,
Joe
是在
Akash
之前插入的,但是在检索时,您会在
Joe
之前获得
Akash
,在
LinkedHashMap
中,插入顺序保持不变。

HashMap
不保持插入顺序,在使用
iterator
时,您可以观察到,同时
LinkedHashMap
需要额外的内存来维持迭代时的插入顺序
LinkedHashMap
使用
DoublyLinkedList
来保留顺序,您还可以选择使用
LinkedHashMap
构造函数之一来保留访问顺序(或)插入顺序

访问顺序是最近最少使用的第一个。另一方面,插入顺序的工作方式类似于
FIFO

更新

HashMap<Integer, String> hashMap = new HashMap<>();
hashMap.put(1, "Amrendra");
hashMap.put(10, "Joe");
hashMap.put(2, "Aakash");
hashMap.put(5, "Android");
System.out.println("HashMap: "+hashMap);

hashMap = new LinkedHashMap<>();
hashMap.put(1, "Amrendra");
hashMap.put(10, "Joe");
hashMap.put(2, "Aakash");
hashMap.put(5, "Android");
System.out.println("LinkedHashMap: " + hashMap);
HashMap HashMap=newhashmap();
hashMap.put(1,“Amrendra”);
hashMap.put(10,“Joe”);
hashMap.put(2,“Aakash”);
hashMap.put(5,“安卓”);
System.out.println(“HashMap:+HashMap”);
hashMap=newlinkedhashmap();
hashMap.put(1,“Amrendra”);
hashMap.put(10,“Joe”);
hashMap.put(2,“Aakash”);
hashMap.put(5,“安卓”);
System.out.println(“LinkedHashMap:+hashMap”);
上述截取将产生以下输出


通过输出,您可以清楚地描述在
HashMap
中,
Joe
是在
Akash
之前插入的,但是在检索时,您会在
Joe
之前获得
Akash
,在
LinkedHashMap
中,插入顺序保持不变。

HashMap
不会跟踪插入顺序。当您迭代
HashMap
的条目时,迭代顺序是特定于实现的。当前实现在
HashMap
的bin上迭代,首先返回bin 0中的条目,然后返回bin 1中的条目,依此类推

因此,您看到的
HashMap
的迭代顺序取决于键的
hashCode
,这决定了条目放入的容器

您在
HashMap
-
10
-中放置的第二个键被分配到一个索引比第三个键的bin更高的bin(
2
),这就是为什么在迭代
HashMap
时最后打印
10


当您使用
LinkedHashMap
时,插入顺序将保持不变,当您对条目进行迭代时,您将按照添加到
Map
的键的相同顺序获取它们。HashMap
不会跟踪插入顺序。当您迭代
HashMap
的条目时,迭代顺序是特定于实现的。当前实现在
HashMap
的bin上迭代,首先返回bin 0中的条目,然后返回bin 1中的条目,依此类推

因此,您看到的
HashMap
的迭代顺序取决于键的
hashCode
,这决定了条目放入的容器

您在
HashMap
-
10
-中放置的第二个键被分配到一个索引比第三个键的bin更高的bin(
2
),这就是为什么在迭代
HashMap
时最后打印
10


当您使用
LinkedHashMap
时,插入顺序会保持不变,当您迭代条目时,您会按照相同的顺序获得它们。键是由rajan.kali添加到
映射中的。只需在顺序无关紧要时使用HashMap(在大多数情况下并不如此),在少数情况下使用LinkedHashMap即可

此外,如果可能的话,养成使用接口定义变量的习惯(通常,如果只调用Map中定义的方法,将变量定义为Map,通常不需要明确指出Map是HashMap):

Map hashMap=new hashMap();
Map linkedHashMap=新建linkedHashMap();

拉詹·卡利的回答很好。只需在顺序无关紧要时使用HashMap(在大多数情况下并不如此),在少数情况下使用LinkedHashMap即可

此外,如果可能的话,养成使用接口定义变量的习惯(通常,如果只调用Map中定义的方法,将变量定义为Map,通常不需要明确指出Map是HashMap):