我有点困惑。我正在阅读地图界面。它必须使用集合视图的entrySet()方法来使用迭代器。 entrySet()返回一个包含map元素的Set。同样,每个Set元素都是一个Map.Entry对象。怎么可能?因为Set只包含一个字段,而Map.Entry是一个键值对吗?
答案 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
会有所不同?只需将其视为一个有两名成员的班级 - key
和value
。