每个Set中的元素如何成为一个Map.Entry对象?

3

我有点困惑。我在阅读地图接口时,发现必须使用entrySet()方法来获取集合视图以使用迭代器。entrySet()返回一个包含map元素的set。同样,此set中的每个元素都是一个Map.Entry对象。这怎么可能呢?因为Set只包含一个字段,而Map.Entry是一个键值对。


2
一个Set只包含一个字段?这是什么意思。一个Set是...一组元素。集合中的每个元素都是一个映射条目。每个映射条目都有一个键和一个值。对我来说听起来很合理。 - JB Nizet
5
这里不清楚有什么误解。一个“Set”包含(对)对象的引用,而在这种情况下,对象恰好是“Map.Entry”类型的。 - Oliver Charlesworth
所以,它类似于 - Set<Map.Entry<K,V>> sets? - shaon007
2
是的,它们就是。只是它们的元素类型为 Map.Entry。没有什么神秘的 ;) - fge
3个回答

6
地图基本上是一组键值映射。此外,键是唯一的,值不必是唯一的。一个键值对被封装在一个Map.Entry对象中。当您遍历地图的条目(即键值对集合)时,对于每个entry,您可以使用entry.getKey()来获取键,并使用entry.getValue()来获取值。
除了条目集之外,地图还提供了键集和值集合。例如,在Map中,您有键值对集合Set>,键集合Set和值集合Collection。
遍历条目的具体示例:
Map<String, Date> map = new HashMap<String, Date>();
map.put("now", new Date());
map.put("now+", new Date());
for (Map.Entry<String, Date> entry : map.entrySet()) {
    String key = entry.getKey();
    Date value = entry.getValue();
    System.out.println(String.format("%s => %s", key, value));
}

另一种迭代的方式是通过键:

for (String key : map.keySet()) {
    Date value = map.get(key);
    System.out.println(String.format("%s => %s", key, value));
}

但这种方法不够高效,因为对于每个键,您都必须执行查找以获取值,与使用直接访问值的条目相比。


4

集合元素是对象,Map.Entry实例也是一个对象。一切正确。


2
考虑以下内容:您可以创建自己的 Cat 类,并添加所需属性。例如:
public class Cat {
    private String name;
    private String type;
    private boolean isGrumpy;
    // etc...
}

只要您实现了equals(Object)hashCode(),这个类的实例就可以放在Set中,是吗?
那么为什么Map.Entry应该不同呢?只需将其视为具有两个成员-keyvalue的类即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接