像Python字典一样遍历Java HashMap?
在Python中,你可以在字典里存放键值对,然后可以通过循环来访问它们,下面是一个示例:
for k,v in d.iteritems():
print k,v
那么在Java的HashMap中,有没有办法做到这一点呢?
5 个回答
6
HashMap.entrySet() 方法会返回一组键值对,类似于 Python中的dictionary.iteritems()。你可以通过这些键值对进行循环操作。
我觉得这个方法和Python的版本最接近。
6
如答案所示,基本上有两种方法可以遍历一个 Map
(在这些例子中,我们假设是 Map<String, String>
)。
遍历
Map#entrySet()
:for (Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + "=" + entry.getValue()); }
遍历
Map#keySet()
,然后使用Map#get()
来获取每个键对应的值:for (String key : map.keySet()) { System.out.println(key + "=" + map.get(key)); }
第二种方法可能更容易理解,但在每次迭代时不必要地调用 get()
会影响性能。有人可能会说,创建键集合的迭代器成本更低,因为它不需要考虑值。但实际上,keySet().iterator()
和 entrySet().iterator()
创建并使用的是同一个迭代器。唯一的区别是,在 keySet()
的情况下,迭代器的 next()
调用返回的是 it.next().getKey()
,而不是 it.next()
。
关于 AbstractMap#keySet()
的文档也证明了这一点:
子类的迭代器方法返回一个“包装对象”,它是这个映射的
entrySet()
迭代器。
AbstractMap
的源代码也证明了这一点。以下是 keySet()
方法的一部分(在 Java 1.6 的大约第 300 行):
public Iterator<K> iterator() {
return new Iterator<K>() {
private Iterator<Entry<K,V>> i = entrySet().iterator(); // <-----
public boolean hasNext() {
return i.hasNext();
}
public K next() {
return i.next().getKey(); // <-----
}
public void remove() {
i.remove();
}
};
}
需要注意的是,代码的可读性应该优先于过早的优化,但记住这一点还是很重要的。
21
是的,比如说:
Map<String, String> map = new HashMap<String, String>();
// add entries to the map here
for (Map.Entry<String, String> entry : map.entrySet()) {
String k = entry.getKey();
String v = entry.getValue();
System.out.printf("%s %s\n", k, v);
}