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

pri*_*iya 17 java collections dictionary iterator

通常我们写这个来从地图中获取键和值.

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());
}
Run Code Online (Sandbox Code Playgroud)

为什么我们使用set迭代为什么不直接映射?

Pet*_*rey 26

这就像我们可以在地图上迭代一样接近,因为您必须说明您是只想要键,还是只需要值或整个键/值条目.对于集合和列表,只有一个选项,因此不需要单独的方法来执行此操作.

顺便说一句:这是我迭代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());
Run Code Online (Sandbox Code Playgroud)

在Java 8中,您可以编写

m.forEach((k, v) -> System.out.println(k + ": " + v));
Run Code Online (Sandbox Code Playgroud)


Law*_*Dol 5

因为,从逻辑上讲,map是键对的Set 集合 - 这是Map.Entry所代表的.迭代通常是对集合的操作,而不是具体的映射.

但是,我经常想知道自己为什么Map不实现Iterable<Map.Entry<K,V>>et al并iterator()直接在map条目上提供一个方法而不需要一个入口集(它当然也可以提供完整的SetAPI).