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

时间:2014-02-15 09:05:50

标签: java

我有点困惑。我正在阅读地图界面。它必须使用集合视图的entrySet()方法来使用迭代器。 entrySet()返回一个包含map元素的Set。同样,每个Set元素都是一个Map.Entry对象。怎么可能?因为Set只包含一个字段,而Map.Entry是一个键值对吗?

3 个答案:

答案 0 :(得分:6)

地图基本上是一组key => value映射。此外,键是唯一的,值不一定是。键值对封装在Map.Entry对象中。当您遍历地图的条目(=键值对集合)时,对于每个entry,您可以获得entry.getKey()的密钥和entry.getValue()的值。

除了条目集之外,地图还提供了一组键和值集合。例如,在Map<String, Date>中,您将一组键值对设为Set<Map.Entry<String, Date>>,将键组设为Set<String>,将值集合设为Collection<Date>。< / p>

迭代条目的具体示例:

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

但这效率较低,因为对于每个键,您必须执行查找以获取值,与使用可直接访问值的条目相反。

答案 1 :(得分:4)

设置元素是对象,Map.Entry实例也是一个对象。一切都正确。

答案 2 :(得分:2)

请考虑以下事项:您可以创建自己的Cat类,其中包含您喜欢的任何属性。 E.g:

public class Cat {
    private String name;
    private String type;
    private boolean isGrumpy;
    // etc...
}

只要您实施equals(Object)hashCode(),此类的实例就可以放在Set中,对吗?

那么为什么Map.Entry会有所不同?只需将其视为一个有两名成员的班级 - keyvalue