Java 什么';HashMap.entrySet()和LinkedHashMap.entrySet()的结果有什么不同,它们的性能是否相同;
我知道hashmap(数组+链接)和linkedhashMap(放入时保持顺序)之间的不同 我的问题是entrySet和LinkedEntrySet是否与HashMap和LinkedHashMap具有相同的功能?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 =
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非常关心这个问题。