Java HashMap 性能优化/替代方案
我想创建一个大的HashMap,但性能不够好。有什么想法吗?put()
欢迎其他数据结构建议,但我需要Java Map的查找功能:
map.get(key)
在我的情况下,我想创建一个包含2600万个条目的地图。使用标准的Java HashMap,在200-300万次插入后,放置速率变得难以忍受的缓慢。
另外,有谁知道对密钥使用不同的哈希代码分布是否会有所帮助?
我的哈希码方法:
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;
}
我正在使用加法的关联属性来确保相等的对象具有相同的哈希码。数组是值在 0 - 51 范围内的字节。值在任一数组中仅使用一次。如果 a 数组包含相同的值(按任一顺序),则对象相等,而 b 数组也是如此。所以 a = {0,1} b = {45,12,33} 和 a = {1,0} b = {33,45,12} 是相等的。
编辑,一些注意事项:
一些人批评使用哈希映射或其他数据结构来存储2600万个条目。我不明白为什么这看起来很奇怪。对我来说,这看起来像是一个经典的数据结构和算法问题。我有2600万个项目,我希望能够快速将它们插入数据结构并从中查找它们:给我数据结构和算法。
将默认 Java HashMap 的初始容量设置为 2600 万会降低性能。
有些人建议使用数据库,在其他一些情况下,这绝对是明智的选择。但我实际上是在问一个数据结构和算法问题,一个完整的数据库会过分,而且比一个好的数据结构解决方案慢得多(毕竟数据库只是软件,但会有通信和可能的磁盘开销)。