我应该使用迭代器来对HashMap进行循环吗?

时间:2010-12-08 09:22:54

标签: java loops iterator hashmap

我有HashMap<String,String>(称为p2p),我想对其元素进行循环。我找到了以下简单的方法:

for (String key : p2p.keySet()) {
   value = p2p.get(key);
}

然而,后来我发现人们使用iterator()。例如:

Iterator it = p2p.keySet().iterator();
while(it.hasNext()) {
    key = it.next();
    value = p2p.get(key);
}

对我而言,第一种方式看起来更简单。所以,我的问题是为什么人们使用第二种方式?它是否具有一些客观优势,或者只是简单性的品味和主观性问题?

7 个答案:

答案 0 :(得分:8)

它们是相同的 - enhanced for loop使用迭代器来获取元素(除非你在数组上进行迭代,在这种情况下它使用引擎盖下的长度和数组访问。)

然而,就个人而言,我不会那么迭代 - 我会迭代键/值对:

for (Map.Entry<String, String> entry : p2p.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
}

这样你就不需要做任何实际的查找了。

答案 1 :(得分:2)

如果要在迭代期间删除元素,则需要第二种(较旧的)方法,例如使用Iterator.remove()。使用collection.remove()在迭代期间无法从集合中删除元素 - 这会产生ConcurrentModificationException。

以上描述主要与集合(列表,集合)相关。

答案 2 :(得分:1)

如果您想要键和元素,请转到EntrySet:

这是一个基本的例子:

HashMap<String, Person> hm = new HashMap<String, Person>();

hm.put("A", new Person("p1"));
hm.put("B", new Person("p2"));
hm.put("C", new Person("p3"));
hm.put("D", new Person("p4"));
hm.put("E", new Person("p5"));

Set<Map.Entry<String, Person>> set = hm.entrySet();

for (Map.Entry<String, Person> me : set) {
  System.out.println("Key :"+me.getKey() +" Name : "+ me.getValue().getName()+"Age :"+me.getValue().getAge());

}

答案 3 :(得分:0)

我可以想到几个原因,为什么人们可能会使用第二种(显式迭代器)方式:

  1. “foreach循环”仅在Java 5中引入,因此为较旧的JVM编写的代码不会不会。
  2. foreach循环只适用于简单(尽管很常见)的习语,一次只能处理一个元素。特别是,它不允许您查询通常有用的迭代器的hasNext()方法,或者执行将值对并将其压缩到映射中等的操作。
  3. 尽管如此,为了您的目的,您是对的,显式迭代器没有任何优势。

答案 4 :(得分:0)

Java语言并不总是能够实现第一种方式。它基本上是第二种方式的捷径。

答案 5 :(得分:0)

使用第二种方法有两个原因:

  • 忽略增强的for循环的存在。
  • 功能更强大 - 使用Iterator,您可以检查是否有更多元素hasNext(),并且您可以在迭代列表时删除元素。

答案 6 :(得分:0)

如果您需要迭代值,请执行:

for(String value: map.values(){
   ...
}

如果您需要迭代键值对,请执行以下操作:

for(Map.Entry<String, String> entry: map.entrySet()){
   ... entry.getKey(); 
   ... entry.getValue();
}

请记住,当您想要在迭代期间从集合中删除某些内容时,必须使用显式迭代器(而不是foreach)。