Java 为什么地图不扩展集合接口

Java 为什么地图不扩展集合接口,java,collections,map,Java,Collections,Map,为什么java.util.Map接口不扩展java.util.Collection接口?java.util.Map不是键值对的集合吗?因为集合接口与映射接口基本不兼容。如果MapextendedCollection,那么add(Object)方法会做什么 这两个接口具有非常不同的语义。如果需要将Map的值或键作为集合,则始终可以使用keySet()/values(),因为collections中声明的某些方法不适合Map接口,反之亦然 第一个示例是Collections接口的add(Object

为什么
java.util.Map
接口不扩展
java.util.Collection
接口?
java.util.Map
不是键值对的集合吗?

因为
集合
接口与
映射
接口基本不兼容。如果
Map
extended
Collection
,那么
add(Object)
方法会做什么


这两个接口具有非常不同的语义。如果需要将
Map
的值或键作为集合,则始终可以使用
keySet()
/
values()

,因为
collections
中声明的某些方法不适合
Map
接口,反之亦然


第一个示例是
Collections
接口的
add(Object)
方法,
第二个示例是
Map
接口的
put(K,V)


对于地图而言,根本没有一致的方法可以明智地实现
添加(对象)
——它是一个键,还是一个值?这同样适用于
put(K,V)
数组列表中的键可能是什么

集合假定元素具有一个值。Map采用键/值对的条目。它们可以设计为重复使用相同的通用接口,但是它们实现的某些方法不兼容,例如

Collection.remove(Object) - removes an element.
Map.remove(Object) - removes by key, not by entry.
您可以将一个映射建模为一组条目,这就是
Map.entrySet()
所做的


有一些共同的方法
size()
isEmpty()
clear()
putAll/addAll()
,但作为一个独立的接口,它们不太可能有多大价值。(同样可以使用
Map.entrySet()

所有集合都必须实现一个默认构造函数和另一个将集合作为参数的构造函数。不能使用地图以外的任何其他集合构造地图

由于映射对其可以容纳的对象类型施加了限制,因此不能将映射实现为集合

为什么java.util.Map接口 是否扩展java.util.Collection接口

Map
是一个键/值对,而
Collection
是一组以结构化方式存储的对象的集合,具有指定的访问机制。Map不扩展Collections接口的原因是
add(E)
不像Map的
put(K,V)
那样迎合键值对

另外,如果
Map
必须扩展它,集合的
iterator()
方法将指向什么?键的迭代器或值的迭代器?

不是。这两个构造函数不是严格的要求:它们只适用于通用集合(即,不适用于专用集合),并且写为“应该提供两个”标准“构造函数”,因此即使对于通用集合,也不是绝对必须的。