我想创建一个大型的 HashMap,但是 put()
的性能不够好。有什么想法吗?
其他的数据结构建议是受欢迎的,但是我需要 Java 地图的查找特性:
map.get(key)
在我的例子中,我想创建一个有2600万条目的地图。使用标准的 JavaHashMap,插入200-300万次之后,放入速率变得极其缓慢。
另外,是否有人知道对密钥使用不同的散列代码发行版是否有帮助?
我的 hashcode 方法:
byte[] a = new byte[2];
byte[] b = new byte[3];
...
public int hashCode() {
int hash = 503;
hash = hash * 5381 + (a[0] + a[1]);
hash = hash * 5381 + (b[0] + b[1] + b[2]);
return hash;
}
我使用了加法结合律来确保相同的对象具有相同的 hashcode。这些数组是值在0-51范围内的字节。值在任一数组中只使用一次。如果 a 数组包含相同的值(两种顺序) ,b 数组也是如此,那么对象就是相等的。所以 a = {0,1} b = {45,12,33}和 a = {1,0} b = {33,45,12}是相等的。
编辑,一些注释:
一些人批评使用散列映射或其他数据结构来存储2600万条目。我不明白这有什么奇怪的。在我看来,这是一个典型的数据结构和算法问题。我有2600万个条目,我希望能够快速地将它们插入并从数据结构中查找它们: 给我数据结构和算法。
将默认 JavaHashMap 的初始容量设置为2600万 减少的性能。
有些人建议使用数据库,在其他一些情况下,这绝对是明智的选择。但我实际上是在问一个数据结构和算法的问题,一个完整的数据库将是过度杀伤和比一个好的数据结构解决方案慢得多(毕竟数据库只是软件,但会有通信和可能的磁盘开销)。