【问题标题】:Is there an array based Map implementation?是否有基于数组的 Map 实现?
【发布时间】:2019-03-25 08:41:04
【问题描述】:

据我所知,Java Collections API 中唯一按插入顺序对其条目进行排序的 Map 实现是 LinkedHashMap,它维护一个链表。

为什么没有像ArrayMap 这样在内部使用数组或ArrayList 的东西?将ArrayListLinkedList 分开的差异在地图中不再重要吗?或者我是否遗漏了一些使这种数据结构通常成为一个坏主意的东西?如果是这样的话,如果我想要插入顺序,LinkedHashMap 是我在 Java 标准库中实现 Map 的唯一选择吗?

【问题讨论】:

  • 您可以编写一个使用数组对其内容进行排序的版本。你认为这有什么可能的优势?
  • 为什么要使用ArrayList 在内部保证按插入顺序排序?你想要的是哪个? ArrayList 内部?如果是这样,为什么?广告订单?如果是这样,为什么 LinkedHashMap
  • @user207421 因为List 应该保证插入顺序。我只是好奇是否有ArrayListLinkedList,为什么不在地图中?数据结构的差异对 Map 来说不再重要了吗?

标签: java data-structures collections


【解决方案1】:

HashMap 已经是一个基于数组的数据结构。插入条目时,会对键进行哈希处理,并通过压缩哈希计算确切的索引。然后将该条目放在该索引处。

从 HashMap 生成 LinkedHashMap 所需的额外部分是 LinkedHashMap 的 Entry 还包含一个前一个和下一个指针。

创建一个基于数组的 LinkedHashMap 需要将所有条目向后移动一个索引,以便为前面的新条目创建空间,有效地使其成为 O(n) 操作,这在 O(1) 中发生,当前实施。

【讨论】:

    【解决方案2】:

    Map 接口为映射中的每个条目公开了Map.Entry 对象。这迫使Map 实现实际上拥有这些对象,然后很容易将它们链接在一起形成一个双向链表。

    此外,当从映射中删除条目时,需要从插入顺序列表中的任何位置删除它,如果在链接结构中执行此操作,则比在数组中更有效显而易见的方式。

    这两件事都是可以修复的,并且可以创建一个Map 来维护由数组支持的插入顺序,但它会有点复杂并且没有任何优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多