我一直想知道java.util中的Map。
为什么values()方法返回一个Collection,而keySet和entrySet返回一个Set?
Set and Collection的优点/缺点是什么?
答案 0 :(得分:6)
一个集合保证给定条目只能存在一次。收藏品没有。由于Map在值方面没有唯一性保证,因此它们的集合根本不是集合,而是必须是集合。
答案 1 :(得分:6)
这不是一个优点和缺点的问题 - 它是map的键,值和条目代表重要的。
地图中的关键字是唯一的
Map
中的密钥是唯一的 - 也就是说,Map
中不会有重复的密钥。确保不存在重复项的Collection
为Set
。
因此,密钥会以keySet
方式返回Set
。
地图中的值不一定是唯一的
另一方面,Map
的{{3}}不一定是唯一的。
例如,我们可以在地图中创建一个条目,其中键"fruit"
映射到值"apple"
,还有另一个条目,其中键"computer"
映射到值{{ 1}}:
"apple"
允许在地图中包含重复值。
因此,我们不能使用map {
key:"fruit" -> value:"apple"
key:"computer" -> value:"apple"
}
,因为这需要所有条目都是唯一的。对Set
的值的一个很好的选择是返回一个普通的Map
,因为它不会对值的含义施加任何限制。
地图中的条目也是唯一的
Collection
的条目是唯一的 - 它们是键和值的组合,由values对象表示。由于此键值对是唯一的,因此Map.Entry
方法将其返回为Map
。
进一步阅读
答案 2 :(得分:4)
地图内部管理一组键,因为键是唯一的值不是
返回此地图中包含的键的Set视图。该集由地图支持,因此对地图的更改将反映在集中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。该集支持元素删除,它通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。它不支持add或addAll操作。
另见
答案 3 :(得分:2)
Set
是Collection
,不包含重复元素。在可能的情况下返回Set
的优点是它可以明确保证唯一性。
正如其他人已经指出的那样,values()
无法返回一个Set,因为值的集合可能包含重复项。
答案 4 :(得分:2)
values()可能重复,因此它是Collection
。
keySet()和entrySet()无法重复,因此它们是Set
。
ps:Set
是非重复的Collection
。