【问题标题】:Why does Map not extend Collection interface [duplicate]为什么Map不扩展Collection接口[重复]
【发布时间】:2011-08-07 16:38:16
【问题描述】:

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

【问题讨论】:

  • 不是。 Map.entrySet() 是,如果实施。

标签: java collections map


【解决方案1】:

为什么没有 java.util.Map 接口 扩展 java.util.Collection 接口?

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

另外,如果 Map 必须扩展 Collection 的 iterator() 方法会指向什么?键的迭代器还是值的迭代器?

【讨论】:

    【解决方案2】:

    集合假定元素具有一个值。 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()可以代替)

    【讨论】:

      【解决方案3】:

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

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

      根本没有一致的方式来明智地为 Map 实现 add(Object) - 它是键,还是值?这同样适用于put(K, V)ArrayList 中的键可能是什么?

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 这两个构造函数不是严格要求:它们仅适用于通用集合(即不适用于专门的集合),它被写成'应该提供两个“标准”构造函数',所以即使是通用集合也不是绝对必须的。
        【解决方案5】:

        因为Collection 接口在很大程度上与Map 接口不兼容。如果Map 扩展Collectionadd(Object) 方法会做什么?

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

        【讨论】:

          猜你喜欢
          • 2011-02-08
          • 1970-01-01
          • 2012-11-06
          • 1970-01-01
          • 2019-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多