使地图的行为类似于ArrayList

时间:2015-03-11 05:40:12

标签: java dictionary arraylist hash hashmap

这就像我读过的java拼图,我知道没有实际的好处。问题是 -
您是否可以使用ArrayList实现Map类似的结构?这种结构会带来什么好处?

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

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

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

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

这里使用的键就像ArrayList的索引一样。我认为这种结构的好处(如果我错了请纠正我) -

  1. 可以在ArrayList
  2. 的最后添加ArrayList.个项目的任何索引处添加项目
  3. 可以更快地访问项目,因为使用了散列(对此有点困惑)
  4. 我知道我们不应该在现实生活中使用这些类型的结构。但我只是想知道散列是否可以比索引更快地使用来从集合中访问项目?

2 个答案:

答案 0 :(得分:1)

我同意第一点可以将其视为一个特征。

但关于访问它会慢ArrayList我猜。

在这种情况下,它会像

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

ArrayList的工作方式如

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

答案 1 :(得分:1)

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

你也可以映射负数,这是一个不能用于ArrayList的东西(根据具体情况,这可能是好的还是坏的。)

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