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):