我有两种方法可以遍历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);
}
答案 0 :(得分:3)
这两个基本相同(第一个代码段中的原始类型除外 - 如果您使用显式Iterator
,则没有理由使用原始Set
,{{1} }和Iterator
- 使用Map.Entry
,Set<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);
}