哪一个更好地遍历HashMap中的每个条目?

时间:2017-11-13 09:29:47

标签: java dictionary collections

我有两种方法可以遍历hashmap中的每个条目,你能解释哪一个比其他条目更受欢迎,为什么?

HashMap m = new HashMap();
m.put("A",100);
m.put("B",100);
m.put("C",100);
m.put("D",100);

迭代的一种方法

Set s1 = m.entrySet();
Iterator itr = s1.iterate();
while(itr.hasNext()) {
Map.Entry m1 = (Map.Entry)s1.next();
System.out.println(m1.getKey()+"..."+m1.getValue);
}

迭代的第二种方式

Set<Map.Entry<String,Integer>> s1 = m.entrySet();
for(Map.Entry<String,Integer> m1:s1){
System.out.println(m1.getKey()+"..."+m1.getValue); 
}

3 个答案:

答案 0 :(得分:3)

这两个基本相同(第一个代码段中的原始类型除外 - 如果您使用显式Iterator,则没有理由使用原始Set,{{1} }和Iterator - 使用Map.EntrySet<Map.Entry<String,Integer>>Iterator<Map.Entry<String,Integer>>)。

增强的for循环在幕后创建Map.Entry<String,Integer>

但是,如果您希望在迭代Iterator时删除Set中的元素,则必须使用明确的Iterator(以及Iterator&{39} remove()方法)。

此外,在第一个代码段中,您可以合并前两个语句 - Iterator<Map.Entry<String,Integer>> itr = m.entrySet().iterator(); - 因为您不需要Set引用。

答案 1 :(得分:2)

注意:为了更简单地比较真正的差异,我重写了代码

如果你想要忘记它们属于容器的元素...... 第二种方式更好,因为更简洁,更清晰阅读

for (Map.Entry<String,Integer> elem : m.entrySet()) {
  System.out.println(elem.getKey() + "..." + elem.getValue()); 
}

但是,如果您需要对容器结构本身进行操作(例如,添加,删除元素)...... 第一种方式是正确的

for (Iterator<Map.Entry<String, Integer>> itr = m.entrySet().iterator(); 
     itr.hasNext();) { 
  Map.Entry<String, Integer> elem = itr.next(); 
  System.out.println(elem.getKey() + "..." + elem.getValue());  
}

答案 2 :(得分:1)

他们相同,所以我肯定更喜欢第二种,因为它更简单,更快一点(尽管可能很难注意到)。

我进一步简化它:

for(Map.Entry<String,Integer> m1 : s1.entrySet()){
  System.out.println(m1.getKey() + "..." + m1.getValue); 
}