使地图表现得像 ArrayList

Making a Map Behaves Like an ArrayList

这有点像我读过的 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. 的最后一个索引的任何索引处添加项
  3. 由于使用了散列,因此可以更快地访问项目(对此有点困惑)

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

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

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

在这种情况下它会像

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

其中 ArrayList 的工作方式与

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

一个好处是能够拥有 "sparse" 值而不会造成内存命中。使用 ArrayList,如果您在位置 0 和 1,001 处有一个项目,它会留下 1,000 个空白空间并占用大量额外内存。使用 HashMap,没有命中。扩展稀疏列表中的最大条目(如果未正确初始化)会产生类似的效果。使用 ArrayList 时,必须将全部内容复制到新大小的新 ArrayList 中。一般来说,HashMap 的大小与条目的数量有关,ArrayList 的大小将基于最高位置。

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

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