【问题标题】:Making a Map Behaves Like an ArrayList使 Map 的行为类似于 ArrayList
【发布时间】:2015-05-12 19:31:38
【问题描述】:

这有点像我读过的 java 谜题,我知道没有实际的好处。问题是-
"你能用Map实现类似ArrayList的结构吗?这种结构有什么好处?"

那么我认为我们可以使用这样的结构(存储String) -

Map<Integer, String> dummyArrayList = new HashMap<>();  

现在我们可以像这样使用ArrayList 的结构 -

dummyArryList.put(1, "firstString");
dummyArrayList.put(2, "secondString");
dummyArrayList.put(9, "9thString");

这里的键被用作ArrayList 的索引。我认为这种结构的好处(如果我错了,请纠正我)-

  1. 可以在ArrayList 中添加项目在ArrayList. 末尾的任何索引处添加项目
  2. 使用散列可以更快地访问项目(对此有点困惑)

我知道我们不应该在现实生活中使用这些类型的结构。但我只想知道是否可以使用散列比索引更快地访问集合中的项目?

【问题讨论】:

  • 不,它永远不会真正更快。
  • @LouisWasserman 一个极其稀疏的列表(想想一个有两个非空值,一个为 0,一个为 Integer.MAX_VALUE)肯定会更快地创建,并且可能更快地操作——假设您甚至可以创建 ArrayList 而不会耗尽内存,而您很可能无法做到。

标签: java dictionary arraylist hash hashmap


【解决方案1】:

我同意第一点,它可以被视为一项功能。

但我猜想访问它会比ArrayList 慢。

在这种情况下,它会像这样

  • 计算key的hash (hashcode())
  • 匹配哈希值
  • 再次匹配密钥(equals()
  • 访问项目

ArrayList 的工作方式

  • 找到响应第一个(0索引)的块,就像数组一样
  • 访问项目

【讨论】:

    【解决方案2】:

    一个好处是能够在没有内存命中的情况下获得“稀疏”值。使用 ArrayList 如果您在位置 0 和 1,001 有一个项目,它会留下 1,000 个空白空间并占用大量额外内存。使用 HashMap,没有命中。扩展稀疏列表中的最大条目(如果未适当初始化)也会发生类似的效果。使用 ArrayList,必须将全部内容复制到新大小的新 ArrayList 中。一般来说,HashMap 的大小与条目的数量有关,ArrayList 的大小将根据最高位置进行调整。

    您还可以映射负数,这是 ArrayList 无法做到的(这可能是好是坏,取决于具体情况)。

    另一个潜在的好处是能够使空值“显式”与未映射。使用 ArrayList 两个状态将为 null 并具有值。使用 HashMap,您将处于未映射的第三种状态,这在技术上与 null 不同。可以使用或忽略此“功能”。

    【讨论】:

    • 感谢您的回复。我知道在数组中我可以将一些索引位置留空。这意味着我可以在数组[20] 的索引 1 和索引 5 处放置一些值,并且可以将其余部分留空。但是ArrayList 有可能吗?。
    • 是的,ArrayList.set(int, Object) 就是这样做的。
    • 谢谢 我不知道
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多