Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-HashMap.get()调用的开销有多大?_Java_Hashmap - Fatal编程技术网

Java-HashMap.get()调用的开销有多大?

Java-HashMap.get()调用的开销有多大?,java,hashmap,Java,Hashmap,HashMap.get()调用的开销有多大? 所讨论的映射包含数百个映射,我希望每秒调用.get()60-1200次。这取决于有多少冲突(冲突可以将其效率从O(1)提高到O(N)),以及哈希集/映射/表包含的任何对象的hashCode()方法的实现 如果需要的时间太长,您应该编写一个简单的基准测试 它取决于映射中元素的数量及其哈希代码分布。 如果哈希码是均匀分布的,那么获取元素的复杂度是O(1) 在一台相当现代的机器上,一个HashMap中的数百个元素应该不是什么大问题,如果只有几个hashco

HashMap.get()调用的开销有多大?
所讨论的映射包含数百个映射,我希望每秒调用.get()60-1200次。

这取决于有多少冲突(冲突可以将其效率从O(1)提高到O(N)),以及哈希集/映射/表包含的任何对象的hashCode()方法的实现

如果需要的时间太长,您应该编写一个简单的基准测试


它取决于映射中元素的数量及其哈希代码分布。 如果哈希码是均匀分布的,那么获取元素的复杂度是O(1)

在一台相当现代的机器上,一个HashMap中的数百个元素应该不是什么大问题,如果只有几个hashcode冲突,那么它应该是毫秒(或更少)的问题。
只要测量一下就可以了。

HashMap.get()
平均是
O(1)
,这意味着它相当有效。根据HashMap中元素的数量,这种效率可能会略有下降,但仍然应该非常有效

如果希望获得良好的性能,应该注意正确实现键的hashcode方法,以便对象在映射的存储桶中均匀分布

这与HashMap的工作方式有关——过于简化了一点

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

如果只有返回不同散列码的键(如果有无限多个存储桶),HashMap可以准确地告诉哪个键+值对位于哪个存储桶中,但事实并非如此

可能有多个键返回相同的哈希代码(导致将它们放在同一个bucket中),因此当HashMap找到包含多个元素的正确bucket时,它将迭代所有键并使用
equals()
查找请求的一个。铲斗中的元素越少,检查速度越快

因此,
hashCode()
实现越好,冲突越少,性能越好。当然,您向HashMap中添加的元素越多,冲突发生的可能性就越大。

,HashSet以恒定时间(O(1))运行添加、删除和包含操作,前提是您的对象具有性能良好的哈希函数。这意味着不管散列集的大小,所花费的时间大致相同

出于上述目的,“性能良好”的散列函数是指在给定相同输入对象的情况下,始终在恒定时间内计算相同的散列,并为不同对象计算不同的散列值的函数(减少“散列冲突”)


粗略地说,哈希映射的工作原理是非常快速地计算哈希代码,并且只检查应该包含相关元素的哈希桶。因为计算哈希代码应该是固定时间(实际上非常快),访问bucket应该是固定时间(实际上非常快),所以HashMap是最有效的map实现之一。

它取决于HashMap中保存的对象的hashCode函数。“效率可能会略有下降,这取决于元素的数量”。我认为。请解释你的意思……以及所讨论的存储桶的数量。HashMap的典型实现会偶尔调整自己的大小以恢复效率,如果存储桶的数量远小于元素的数量,那么(很少)操作成本相当高。通过将预期大小传递给HashMap构造函数,您可以避免该操作,并使其运行非常接近
O(1)
。我想说,这也不取决于hashMap的大小,而取决于负载系数。因此……试试看,看看它是否满足您的需要。请参阅:过早优化。具体来说,如果不知道密钥是什么以及如何散列,这个问题是无法回答的。也就是说……除非您使用自己的类作为密钥,并使用可怕的散列函数,否则这是一个非常小的请求量,每个请求都不会接近1ms。HashMap.get()是O(1)。它的原始性能取决于hashCode()和equals()的方式键的方法可以工作,但对于合理的键,每秒1200次根本不是问题。测量它。所讨论的键实际上是一个字符串-我假设它们有非常有效的hashCodes()方法。如果您关心java集合的性能,请特别尝试,如果您事先知道键和值的类型。
long start = System.currentTimeMillis()

...Process hashmap gets here

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