Java - HashMap.get()调用的代价是多少?

时间:2013-07-27 21:33:41

标签: java hashmap

HashMap.get()调用有多贵? 有问题的地图包含数百个映射,我希望在每秒60-1200次之间调用.get()。

4 个答案:

答案 0 :(得分:7)

HashMap.get()平均为O(1),这意味着效率非常高。这种效率可能略有下降,具体取决于HashMap中的元素数量,但仍然应该非常高效。

如果你想要获得良好的性能,你应该注意正确实现你的键的哈希码方法,这样对象就可以在地图的桶中统一分布。

这与HashMap的工作方式有关 - 过度简化了一下。

Java中的每个对象都有hashCode()equals()方法。当您将值放入HashMap时,它将计算它所属的存储桶。这是基于传递给key方法的put(key,value)完成的。 HashMap使用密钥的hashCode()方法返回的值。

如果只有键返回不同的哈希码(如果你有无限数量的桶),HashMap可以准确地确定哪个键+值对存在于哪个桶中,但实际情况并非如此。

可能有多个键返回相同的哈希码(导致将它们放在同一个桶中),因此当HashMap找到具有多个元素的正确存储桶时,它将迭代所有键并使用{{1}找到被请求的那个。桶中的元素越少,检查越快。

因此equals()实施越好,冲突越少,性能越好。当然,放入HashMap的元素越多,碰撞发生的可能性就越大。

答案 1 :(得分:1)

这取决于你有多少碰撞(碰撞可以将其效率从O(1)推到O(N))以及hash-set / map / table包含的任何对象的hashCode()方法的实现。

您应该编写一个简单的基准来测试它是否花费太长时间。Denial of Service with String hashCode()

long start = System.currentTimeMillis()

...Process hashmap gets here

long time = System.currentTimeMillis()-start;
System.out.println("Took "+time+"ms");

答案 2 :(得分:0)

它取决于地图中元素的数量及其哈希码分布。 如果哈希码是均匀分布的,则获取元素的复杂度为O(1)。

HashMap中的数百个元素在相当现代的机器上不应该是一个大问题,如果只有少量哈希码冲突,它应该是毫秒(或更少)。 只是衡量一下。

答案 3 :(得分:0)

Like most hash table implementations,HashSet在常量时间(O(1))中运行 add remove 包含操作,假设您的对象具有良好的哈希函数。这意味着无论散列集的大小如何,它都需要大致相同的时间。

出于上述目的,“良好行为”的散列函数总是在给定相同输入对象的情况下以恒定时间计算相同散列,并且针对不同对象计算不同散列值(减少“散列冲突”) )。

粗略地说,哈希映射通过非常快速地计算哈希代码并且仅检查应该包含相关元素的哈希桶来工作。因为计算哈希码应该是恒定的时间(并且在实践中非常快),并且访问存储桶应该是恒定的时间(并且在实践中非常快),HashMap是那里最有效的地图实现之一。