Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/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.entrySet()和LinkedHashMap.entrySet()的结果有什么不同,它们的性能是否相同;_Java - Fatal编程技术网

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

Java 什么';HashMap.entrySet()和LinkedHashMap.entrySet()的结果有什么不同,它们的性能是否相同;,java,Java,我知道hashmap(数组+链接)和linkedhashMap(放入时保持顺序)之间的不同 我的问题是entrySet和LinkedEntrySet是否与HashMap和LinkedHashMap具有相同的功能? Map<String,Integer> hashmap= new HashMap<>(); Map<String,Integer> linkedmap = new LinkedHashMap<>(); Set hashset =

我知道hashmap(数组+链接)和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);
    }
}
Map hashmap=new hashmap();
Map linkedmap=new LinkedHashMap();
Set hashset=hashmap.entrySet()//入口
Set linkedset=linkedmap.entrySet()//LinkedEntrySet
//这是我的测试代码
@试验
公共void映射测试(){
Map hashMap=新hashMap();
Map linkedHashMap=新建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);//linkedHashMap将保持秩序
Set hashSet=hashMap.entrySet();
Set linkedSet=linkedHashMap.entrySet();//linkedSet也会遵守顺序吗???
for(对象o:hashSet){
系统输出打印ln(o);
}
用于(对象o:链接集){
系统输出打印ln(o);
}
}
查看代码(Java 8),在这两种情况下
entrySet()
都返回相应
映射的内部类的实例
实现:

对于
LinkedHashMap

public Set<Map.Entry<K,V>> entrySet() {
    Set<Map.Entry<K,V>> es;
    return (es = entrySet) == null ? (entrySet = new LinkedEntrySet()) : es;
}
public Set<Map.Entry<K,V>> entrySet() {
    Set<Map.Entry<K,V>> es;
    return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}
如您所见,它们既不使用
LinkedHashSet
也不使用
HashSet
。它们有特定的
Set
实现


他们使用特定内部实现的原因是这些
Set
s由相应的
Map
s支持,因此它们没有自己的存储。

您不能自己调试并检查它吗?我已经调试过了。第一个Map返回1,2,3,4,5,6,7,8秒返回1,3,2,5,8,6,7,4。让我烦恼的是,第一个应该返回随机顺序,但是返回asc顺序——不管Javadoc说它们是什么。除此之外,你不能依赖任何东西。
set.getClass()
set1.getClass()
应该告诉你什么是classthx~我发现答案是return EntrySet linkedentryset毕竟这个实现不是特定的吗?方法签名表示返回对
集的引用。谁在乎引用对象的实际运行时类型是什么?如果这很重要,那么返回类型将使用
Set
的子类。每一个新版本的Java都可能从根本上改变这些方法的实现。@Matthias好吧,OP非常关心这个问题。