我有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);
}
对我而言,第一种方式看起来更简单。所以,我的问题是为什么人们使用第二种方式?它是否具有一些客观优势,或者只是简单性的品味和主观性问题?
答案 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)
我可以想到几个原因,为什么人们可能会使用第二种(显式迭代器)方式:
hasNext()
方法,或者执行将值对并将其压缩到映射中等的操作。尽管如此,为了您的目的,您是对的,显式迭代器没有任何优势。
答案 4 :(得分:0)
Java语言并不总是能够实现第一种方式。它基本上是第二种方式的捷径。
答案 5 :(得分:0)
使用第二种方法有两个原因:
Iterator
,您可以检查是否有更多元素hasNext()
,并且您可以在迭代列表时删除元素。答案 6 :(得分:0)
如果您需要迭代值,请执行:
for(String value: map.values(){
...
}
如果您需要迭代键值对,请执行以下操作:
for(Map.Entry<String, String> entry: map.entrySet()){
... entry.getKey();
... entry.getValue();
}
请记住,当您想要在迭代期间从集合中删除某些内容时,必须使用显式迭代器(而不是foreach)。