扁平化多维 HashMap 以获得更好的性能?

xpa*_*oob 3 java hashmap multidimensional-array

我经常使用多维 HashMap,即包含 HashMap 的 HashMap。例如,在两键的基础上,我设置/获取一个存储值

hashmapMulti.get(key1).put(key2,x);
hashmapMulti.get(key1).get(key2);
Run Code Online (Sandbox Code Playgroud)

但是,我也可以使用“平面”哈希图并组合两个键来设置/获取值:

hashmapFlat.put(key1+"|"+key2,x);
hashmapFlat.get(key1+"|"+key2);
Run Code Online (Sandbox Code Playgroud)

如果我的信息正确的话, HashMap 的 put 和 get 的时间复杂度应该“或多或少”为O(1)。通过扁平化,我基本上用组合 3 个字符串的成本来交换 get(恒定时间)的成本。

哪种方式更快?

最佳选择是否取决于 HashMap 中存储的对象数量?

biz*_*lop 5

第三种选择是编写一个封装组合键的类。

它将有两个字段用于两个单独的键,如果您正确地重写它的equals()hashCode()方法,则不必依赖于字符串连接。

虽然从性能角度来看,您的最佳选择是编写实际的基准测试并比较您的实现,但这绝对是最干净的解决方案:它可以立即读取,并且避免了对字符串连接的相当脆弱的依赖(即您可以拥有包含字符的键|)。

  • 是和不是。是的,您可能每次都必须创建一个新的“KeyPair”(尽管根据实际用例,您可能不必这样做),但您应该将其与字符串连接的成本进行比较:创建一个新的“StringBuilder”对象,完成它自己的字符缓冲区,然后将三个字符串复制到该缓冲区(可能扩展缓冲区),然后将结果复制到新创建的“String”对象中。在“HashMap”查找中,仅当存在哈希冲突时才会调用“equals()”,在其他情况下,仅使用“hashCode()”,并且没有真正的额外成本。 (2认同)