使地图表现得像 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
的索引一样使用。我认为这种结构的好处(如果我错了请指正)-
- 可以在
ArrayList
项添加到 ArrayList.
的最后一个索引的任何索引处添加项
- 由于使用了散列,因此可以更快地访问项目(对此有点困惑)
我知道我们不应该在现实生活中使用这些类型的结构。但我只想知道是否可以使用散列比索引更快地访问集合中的项目?
我同意第一点,它可以被视为一个功能。
但是我想访问它会比 ArrayList
慢。
在这种情况下它会像
- 计算键的哈希值 (
hashcode()
)
- 匹配哈希值
- 再次匹配密钥(
equals()
)
- 访问项目
其中 ArrayList
的工作方式与
相同
- 找到对第一个(0 索引)有响应的块,就像数组
- 访问项目
一个好处是能够拥有 "sparse" 值而不会造成内存命中。使用 ArrayList,如果您在位置 0 和 1,001 处有一个项目,它会留下 1,000 个空白空间并占用大量额外内存。使用 HashMap,没有命中。扩展稀疏列表中的最大条目(如果未正确初始化)会产生类似的效果。使用 ArrayList 时,必须将全部内容复制到新大小的新 ArrayList 中。一般来说,HashMap 的大小与条目的数量有关,ArrayList 的大小将基于最高位置。
您还可以映射负数,这是 ArrayList 无法做到的(这可能是好是坏,具体取决于情况)。
另一个潜在的好处是能够具有空值 "explicit" 与未映射。对于 ArrayList,两个状态将为 null 并具有值。使用 HashMap,您将拥有未映射的第三种状态,这在技术上与 null 不同。此 "feature" 可以使用或忽略。
这有点像我读过的 java 谜题,我知道没有实际好处。问题是-
“您可以使用 Map
实现类似 ArrayList
的结构吗?这种结构有什么好处?”
然后我想我们可以使用这样的构造(存储String
) -
Map<Integer, String> dummyArrayList = new HashMap<>();
现在我们可以像这样使用结构作为 ArrayList
-
dummyArryList.put(1, "firstString");
dummyArrayList.put(2, "secondString");
dummyArrayList.put(9, "9thString");
这里的键像ArrayList
的索引一样使用。我认为这种结构的好处(如果我错了请指正)-
- 可以在
ArrayList
项添加到ArrayList.
的最后一个索引的任何索引处添加项
- 由于使用了散列,因此可以更快地访问项目(对此有点困惑)
我知道我们不应该在现实生活中使用这些类型的结构。但我只想知道是否可以使用散列比索引更快地访问集合中的项目?
我同意第一点,它可以被视为一个功能。
但是我想访问它会比 ArrayList
慢。
在这种情况下它会像
- 计算键的哈希值 (
hashcode()
) - 匹配哈希值
- 再次匹配密钥(
equals()
) - 访问项目
其中 ArrayList
的工作方式与
- 找到对第一个(0 索引)有响应的块,就像数组
- 访问项目
一个好处是能够拥有 "sparse" 值而不会造成内存命中。使用 ArrayList,如果您在位置 0 和 1,001 处有一个项目,它会留下 1,000 个空白空间并占用大量额外内存。使用 HashMap,没有命中。扩展稀疏列表中的最大条目(如果未正确初始化)会产生类似的效果。使用 ArrayList 时,必须将全部内容复制到新大小的新 ArrayList 中。一般来说,HashMap 的大小与条目的数量有关,ArrayList 的大小将基于最高位置。
您还可以映射负数,这是 ArrayList 无法做到的(这可能是好是坏,具体取决于情况)。
另一个潜在的好处是能够具有空值 "explicit" 与未映射。对于 ArrayList,两个状态将为 null 并具有值。使用 HashMap,您将拥有未映射的第三种状态,这在技术上与 null 不同。此 "feature" 可以使用或忽略。