【发布时间】:2011-08-07 16:38:16
【问题描述】:
为什么java.util.Map 接口不扩展java.util.Collection 接口? java.util.Map 不是键值对的集合吗?
【问题讨论】:
-
不是。 Map.entrySet() 是,如果实施。
标签: java collections map
为什么java.util.Map 接口不扩展java.util.Collection 接口? java.util.Map 不是键值对的集合吗?
【问题讨论】:
标签: java collections map
为什么没有 java.util.Map 接口 扩展 java.util.Collection 接口?
Map 是键/值对,而Collection 是以结构化方式存储的一组对象的集合,并具有指定的访问机制。 Map 没有扩展 Collections 接口的原因是 add(E e); 没有像 Map 的 put(K, V) 那样满足键值对。
另外,如果 Map 必须扩展 Collection 的 iterator() 方法会指向什么?键的迭代器还是值的迭代器?
【讨论】:
集合假定元素具有一个值。 Map 假定键/值对的条目。它们本可以被设计为重用相同的通用接口,但是它们实现的某些方法是不兼容的,例如
Collection.remove(Object) - removes an element.
Map.remove(Object) - removes by key, not by entry.
您可以将 Map 建模为条目的集合,这就是 Map.entrySet() 所做的。
有一些共同点; size()、isEmpty()、clear()、putAll/addAll() 但这些作为独立接口不太可能有太大价值。 (同样Map.entrySet()可以代替)
【讨论】:
因为Collections 中声明的某些方法不适合Map 接口,反之亦然。
第一个例子是Collections接口的add(Object)方法,
第二个例子是Map接口的put(K, V)。
根本没有一致的方式来明智地为 Map 实现 add(Object) - 它是键,还是值?这同样适用于put(K, V)。 ArrayList 中的键可能是什么?
【讨论】:
所有集合都必须实现一个默认构造函数和另一个将集合作为参数的构造函数。您不能使用地图以外的任何其他集合构建地图。
由于 Map 对其可以容纳的对象类型施加了限制,因此您不能将地图实现为集合。
【讨论】:
因为Collection 接口在很大程度上与Map 接口不兼容。如果Map 扩展Collection,add(Object) 方法会做什么?
这两个接口有非常不同的语义。如果您需要 Map 的值或键作为集合,您始终可以使用 keySet()/values()。
【讨论】: