为什么我们使用 entrySet() 方法并使用返回的集合来迭代映射?

2022-09-02 12:11:24

通常我们写这个是为了从映射中获取键和值。

Map m=new HashMap();
Set s=map.entrySet();
Iterator i=s.iterator()
while(s.hasNext()){
    Map.Entry m= (map.Entry) s.next();
    System.out.println(""+m.getKey()+""+ m.getValue());
}

为什么我们要用一个集合来迭代,为什么不直接映射呢?


答案 1

这尽可能接近于迭代地图,因为您必须说您是只想要键,只想要值还是整个键/值条目。对于“集”和“列表”,只有一个选项,因此,无需使用单独的方法来执行此操作。

BTW:这就是我对Map的迭代方式。请注意泛型、for-each 循环和 LinkedHashMap 的使用,以便条目以某种逻辑顺序显示。TreeMap将是另一个不错的选择。

Map<K,V> m=new LinkedHashMap<K,V>();
for(Map.Entry<K,V> entry: m.entrySet())
    System.out.println(entry.getKey() + ": " + entry.getValue());

在Java 8中,你可以写

m.forEach((k, v) -> System.out.println(k + ": " + v));

答案 2

因为,从逻辑上讲,映射是键值对的集合 - 这就是 Map.Entry 所表示的。迭代通常是对集合的操作,而不是特定的地图。

但是,我经常想,为什么不实现 et al 并直接在映射条目上提供一种方法,而不是需要一个条目集(当然,它也可以提供完整的 API)。MapIterable<Map.Entry<K,V>>iterator()Set