键 - HashMap中的值映射

时间:2014-03-04 22:26:14

标签: java hashtable

每当我想在Java中使用像Set或Map这样的通用数据结构时,我就会看到HashSet和HashMap。在搜索了更多这些内容后,我读到了位于它们底部的哈希表。所以我了解到,为了将键映射到其对应的值,它使用哈希函数 我的问题是:为什么不使用简单的索引对应? 我试图回答自己,但我不确定优势的正确性:
通过指数
+更快,因为没有涉及计算 +无碰撞
通过哈希
+内存经济,因为需要第三个数组来关联密钥和值

但我一直认为一些翻牌比几个字节更珍贵。无论如何,我不认为Java中有这样的DS作为简单的IndexMap,是吗?我在这里错过了什么?

编辑:
通过 by-index 我的意思是:一个数组是通过构造一个有序结构,它有索引;所以有2个数组来关联,比如,keys []和values []将意味着keys [i]对应于值[i]。所以,不需要关系功能。我肯定在这里遗漏了一些东西,我想看看是什么。

4 个答案:

答案 0 :(得分:2)

您可以将HashMap视为IndexMap,其中索引可以是任何Object(键),并且它映射到另一个Object(值)。您意义上的IndexMap只是一个List,List将一个int索引映射到一个Object。但List的索引不能是Objects。

答案 1 :(得分:0)

  

为什么不使用简单的索引对应?

因为这会破坏该特定实现的Set合同;在Set中,根据定义的标准,所有值必须是唯一的。在HashSet中,这是对象的相等性(如.equals() / .hashCode())。

此外,Set没有迭代订单保证 - 再次,按合同。因此,您无法使用索引查找Set中的任何内容,即使您知道其.size()(与List不同,看起来更像您想要的内容,您会注意到{ {1}}没有Set方法。

请注意.get()中的密钥也是Map; Set中的密钥是唯一的。

使用哈希表的另一个好处是查找操作的速度(如Map中所示)。

答案 2 :(得分:0)

我要去试试你要问的东西。为什么Java HashMap不像EnumMap或其他不需要哈希的特殊哈希表集合(因为哈希是预先计算的)。

因为HashMap是一个通用集合,所以你可以存储任何对象。如果您想要更快的HashMap(即快速哈希),则需要对您在Map中存储的数据进行某些假设(如EnumMap)。

答案 3 :(得分:0)

我的方向正确但需要考虑您可能要对数据结构执行的更多操作。

访问数组成本o(1),这与基于散列的数据结构相同,但是在数组中搜索可能是非常非常昂贵的o(n),因为它在基于散列的结构中仍然是相同的o(1)。

在决定哪种数据结构对您的应用程序有利时,它取决于您将在该数据结构上执行的操作。如需进一步参考,请查看此页面,其中包含不同数据结构的不同操作摘要:

http://simplenotions.wordpress.com/2009/05/13/java-standard-data-structures-big-o-notation/

希望它有所帮助。