这可能是一个奇怪的问题,但它是基于我使用 Java Map 得到的一些结果 - 在 HashMap
的情况下,本地图较小时,元素检索速度是否更快?
我有一部分代码使用了 HashMap
的 containsKey
和 get(key)
方法,如果 map 中的元素数量较小?是这样吗?
据我所知,HashMap
使用一些散列函数来访问映射的特定字段,并且有版本中该字段是对链表的引用(因为某些键可以映射到相同的值)或 map 中的其他字段,当完全静态实现时。
这是否正确 - 如果 Map 的元素越少,速度会更快?
我需要用一个具体的例子来扩展我的问题。
我有 2 种情况,两者的元素总数相同。
- 在第一种情况下,我有 10 个 HashMap,我不知道元素是如何分布的。该部分算法执行时间为141ms。
- 在第二种情况下,我有 25 个 HashMap,元素总数相同。相同算法的执行时间为69ms。
在这两种情况下,我都有一个遍历每个 HashMap 的 for 循环,试图找到相同的元素,如果存在则获取元素。
会不会是执行时间更小,因为HashMap内部的单个查找更小,所以有sum吗?
我知道这很奇怪,但是这样的事情有可能吗,还是我做错了什么?
考虑了 Map(Integer,Double)。很难说元素的分布是什么,因为它实际上是KMeans聚类算法的实现,元素是聚类质心的表示。这意味着它们将主要取决于算法的初始化。并且元素的总数不会大部分相同,但我已尝试简化问题,如果这有误导性,我们深表歉意。
最佳答案
碰撞次数对减速具有决定性作用。
假设一个数组的大小,散列码对大小取模然后指向放置对象的索引。具有相同索引的两个对象发生碰撞。
在元素数量方面拥有大容量(数组大小)会有所帮助。
与 HashMap有带有额外设置的重载构造函数。
public HashMap(int initialCapacity,
float loadFactor)
构造一个具有指定初始容量和加载因子的空 HashMap。
您可以尝试一下。
对于与 HashMap 一起使用的特定键类,拥有良好的 hashCode 也有帮助。哈希码是一个独立的数学领域。
当然,使用更少的内存有助于处理器/物理内存级别,但我怀疑在这种情况下会产生影响。
关于java - HashMap 速度越小 map 越快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26026424/