每当我想在Java中使用像Set或Map这样的通用数据结构时,我就会看到HashSet和HashMap。在搜索了更多这些内容后,我读到了位于它们底部的哈希表。所以我了解到,为了将键映射到其对应的值,它使用哈希函数
我的问题是:为什么不使用简单的索引对应?
我试图回答自己,但我不确定优势的正确性:
通过指数
+更快,因为没有涉及计算
+无碰撞
通过哈希
+内存经济,因为需要第三个数组来关联密钥和值
但我一直认为一些翻牌比几个字节更珍贵。无论如何,我不认为Java中有这样的DS作为简单的IndexMap,是吗?我在这里错过了什么?
编辑:
通过 by-index 我的意思是:一个数组是通过构造一个有序结构,它有索引;所以有2个数组来关联,比如,keys []和values []将意味着keys [i]对应于值[i]。所以,不需要关系功能。我肯定在这里遗漏了一些东西,我想看看是什么。
答案 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/
希望它有所帮助。