像Python字典一样遍历Java HashMap?

8 投票
5 回答
6252 浏览
提问于 2025-04-16 00:40

在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>)。

  1. 遍历 Map#entrySet()

    for (Entry<String, String> entry : map.entrySet()) {
        System.out.println(entry.getKey() + "=" + entry.getValue());
    }
    
  2. 遍历 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);
}

撰写回答