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

Java 为什么我们要使用entrySet()方法并使用返回的集合来迭代映射?,java,dictionary,collections,iterator,Java,Dictionary,Collections,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()); } 为什么我们要使用集合进行迭代为什么不直接映射?映射是一对事物的集合,对不对(条目)。因此,

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

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());
}

为什么我们要使用集合进行迭代为什么不直接映射?

映射是一对事物的集合,对不对(条目)。因此,您可以迭代条目,或仅迭代键(map.keySet()),或仅迭代值(map.values())。您还希望迭代什么?

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


然而,我经常想知道为什么
Map
不实现
Iterable
等,直接在Map条目上提供一个
iterator()
方法,而不需要一个条目集(当然也可以提供一个完整的
set
API)。

因为Java没有更好的语法来实现它。(你的可以改进)

我很高兴

for(String key, Integer val : map)
    print(key, val);


但是Java没有这些功能。

这几乎可以在地图上进行迭代,因为您必须说明是只需要键、值还是整个键/值项。对于集合和列表,只有一个选项,因此无需使用单独的方法来执行此操作

顺便说一句:这就是我在映射上迭代的方式。注意泛型的使用,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());

这个问题比语法更深。你不能使用老式的
for
循环,也不能使用
while
循环。因此不需要迭代器?@Jwan622 for each循环是在Java 5.0(2004)中添加的,它将为你管理迭代器。对于集合,仍然有迭代器,但你不需要直接使用它(除非你想删除条目)啊,所以在幕后有一个迭代器…明白了。所以一般来说,我们取map对象,调用entrySet将其转化为set对象,然后通过将set对象切片成map来对其进行迭代。Entry的?你怎么说?
Map<K,V> m=new LinkedHashMap<K,V>();
for(Map.Entry<K,V> entry: m.entrySet())
    System.out.println(entry.getKey() + ": " + entry.getValue());
m.forEach((k, v) -> System.out.println(k + ": " + v));