简体   繁体   English

HashMap.entrySet()和LinkedHashMap.entrySet()的结果有什么不同,它们是否具有相同的性能?

[英]What's the different between the result of HashMap.entrySet() and LinkedHashMap.entrySet(),do they have the same performance?

I know the different between the hashmap(arrays + linked) and linkedhashMap(keep the order when you put in it); 我知道hashmap(数组+链接)和linkedhashMap之间的区别(当你输入它时保持顺序);

My question is do the entrySet and LinkedEntrySet has the same feature as HashMap and LinkedHashMap? 我的问题是entrySet和LinkedEntrySet是否具有与HashMap和LinkedHashMap相同的功能?

 Map<String,Integer> hashmap= new HashMap<>();
 Map<String,Integer> linkedmap = new LinkedHashMap<>();

 Set hashset = hashmap.entrySet();//EntrySet
 Set linkedset = linkedmap .entrySet();//LinkedEntrySet

// Here is my test code
@Test
public void mapTest(){
    Map<String,Integer> hashMap= new HashMap<>();
    Map<String,Integer> linkedHashMap= new LinkedHashMap<>();
    hashMap.put("1",1);
    hashMap.put("3",3);
    hashMap.put("2",2);
    hashMap.put("5",5);
    hashMap.put("8",8);
    hashMap.put("6",6);
    hashMap.put("7",7);
    hashMap.put("4",4);

    linkedHashMap.put("1",1);
    linkedHashMap.put("3",3);
    linkedHashMap.put("2",2);
    linkedHashMap.put("5",5);
    linkedHashMap.put("8",8);
    linkedHashMap.put("6",6);
    linkedHashMap.put("7",7);
    linkedHashMap.put("4",4);//LinkedHashMapwill keep the order

    Set hashSet = hashMap.entrySet();
    Set linkedSet= linkedHashMap.entrySet();//the linkedSetwill keep the order too???
    for (Object o : hashSet ) {
        System.out.println(o);
    }
    for (Object o : linkedSet) {
        System.out.println(o);
    }
}

Looking at the code (Java 8), in both cases entrySet() returns an instance of an inner class of the corresponding Map implementation : 查看代码(Java 8),在两种情况下, entrySet()返回相应Map实现的内部类的实例:

For LinkedHashMap : 对于LinkedHashMap

public Set<Map.Entry<K,V>> entrySet() {
    Set<Map.Entry<K,V>> es;
    return (es = entrySet) == null ? (entrySet = new LinkedEntrySet()) : es;
}

For HashMap : 对于HashMap

public Set<Map.Entry<K,V>> entrySet() {
    Set<Map.Entry<K,V>> es;
    return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}

As you can see, they don't use neither LinkedHashSet nor HashSet . 如您所见,它们既不使用LinkedHashSet也不使用HashSet They have specific Set implementations. 他们有特定的Set实现。

And the reason they use specific internal implementations it that these Set s are backed by the respective Map s, so they don't have storage of their own. 并且他们使用特定内部实现的原因是这些Set由相应的Map支持,因此他们没有自己的存储。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM