确保每个Hashmap存储桶/插槽一个值

时间:2012-12-25 21:14:35

标签: java collections map hashmap

有没有办法严格确保每个Hashmap存储桶的条目数而不会篡改Java中的object.hashcode()函数?

负载系数是一个平均值:(条目数) / (桶数#)。本质上,假设我有一个容量为1000的Hashmap。为了这个例子,假设我使用的是1的加载因子。我将要存储在HashMap中的100个对象具有错误的哈希码函数,它总是返回每个对象的值相同。当我完成存储100个对象时,它们将全部映射到相同的HashMap存储桶,最终我最终得到了LinkedList性能。负载因子将保持静默,因为100个条目/ 1000个桶= 0.1 <1。 1.如果我放入1M的相同物体会发生什么。 HashMap永远不会调整大小(无论如何都不会使用),因为 LF 永远不会被触发。

我知道这在现实世界中是一个不寻常的场景,但我希望提高我的理解力。在HashMap中是否有办法防止这种情况或者至少从结构本身得到一些警告?

2 个答案:

答案 0 :(得分:4)

HashMap将始终根据密钥的哈希码计算要使用的存储桶。如果每个密钥具有相同的哈希码,则它们都将映射到同一个桶。如果不提供更好的hashCode()实施,则无法阻止您所描述的行为。

您可以查看使用开放式寻址的地图实施(例如TroveTHashMap)。他们每桶只有一个条目。但性能不会提高,它们只是以不同的方式处理冲突,它们也无法解决根本问题:糟糕的哈希代码。

答案 1 :(得分:0)

编写完美的HashFunction是实现您所需要的唯一方法。

给定一组小的特权输入,可以调整排列表,以便这些输入产生不同的哈希值,产生所谓的完美哈希函数。

结帐Pearson's Hashing