【问题标题】:Are sets actually implemented as maps?集合实际上是作为地图实现的吗?
【发布时间】:2016-12-16 07:32:27
【问题描述】:

StackOverflow 上的每一个地方,我都能看到响应:

Set 只是 Map,除了它是 KeyValue。这就是SetMap 不能有重复的原因,因为它违反了唯一的Key 原则。

但后来我看到(例如)Set 根本不涉及Map。事实上,Map 甚至不是Collections 的一部分,而Set 是。但对我来说,这没有意义,因为 JDK 中HashSet 的实现很可能与HashMap 的实现非常相似,除了两者来自不同的接口。

SetMap在这方面有什么关系?

【问题讨论】:

  • 看源码肯定对你有帮助。 Set 确实得到了一些 Map 的支持
  • 另外,请注意您不应该考虑HashSetTreeSet 是如何实现的,并且想知道为什么由Map 支持的类应该被视为一个集合。实现可以改变,这是应该在这里考虑的功能
  • 你在哪里找到这张图片的?我可以用吗?我正在做一个关于集合框架的教程,我喜欢这个例子。
  • @diegocolli 我在搜索“java 集合”时在谷歌图片上找到了它。但是您可以找到图像here。这显然是一篇俄罗斯博客文章,但它还有其他与收藏相关的图片。抱歉,我不能提供更多帮助。

标签: java dictionary data-structures set


【解决方案1】:

SetMap 接口不相关(Map 接口的 keySet()entrySet() 方法除外,它们返回由 Map 支持的 Sets)。

然而,一些Set 实现使用支持Map 实现来存储它们的数据(Set 的元素成为底层Map 中的键,而底层Map 的值只是虚拟的对象)。 HashSetTreeSet 也是如此。

Javadoc 中提到了这一点:

公共类HashSet
扩展抽象集
实现 Set、Cloneable、Serializable

这个类实现了 Set 接口,由一个哈希表(实际上是一个 HashMap 实例)支持

And

公共类TreeSet
扩展抽象集
实现 NavigableSet、Cloneable、Serializable

基于 TreeMap 的 NavigableSet 实现。

【讨论】:

    【解决方案2】:

    实际上 Set 接口不受 Map 或任何东西的支持。但是,HashSet 是使用 Hashmap 作为实际的数据结构来实现的。

    Set 并不是说​​在javadoc 中有 Map

    不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。正如其名称所暗示的,该接口对数学集抽象进行建模。

    但是,根据javadoc Hashset 正在内部使用 HashMap 以确保维护唯一数据。

    这个类实现了 Set 接口,由一个哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。此类允许 null 元素。

    它将添加到 Map 内的 Set 的值保留为键,而不是值。它在所有条目的值中添加相同的常量单个对象。

      public boolean More ...add(E e) {
         return map.put(e, PRESENT)==null;
    }
    

    这里,PRESENT 是要保存在 backign Map 中的静态值虚拟对象。

      private static final Object PRESENT = new Object();
    

    当我们调用 HashSet 的各种构造函数时,会创建支持 Map 对象:-

      public More ...HashSet() {
        map = new HashMap<E,Object>();
       }
    

    public More ...HashSet(Collection c) { map = new HashMap(Math.max((int) (c.size()/.75f) + 1, 16)); 添加全部(c); }

    public More ...HashSet(int initialCapacity, float loadFactor) { map = new HashMap(initialCapacity, loadFactor); }

    所有源码都可以在这个link看到

    请参阅 javadocs 了解 Map 支持的其他 Set 实现。

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2021-12-17
      • 2014-06-29
      • 2015-09-05
      相关资源
      最近更新 更多