我有一个由3个字段标识的对象。一个是表示6个十六进制字节的字符串,另外两个是每个不超过1个字节的整数。总而言之,这是8个字节的数据,适合64位整数。
我需要映射这些对象以便快速访问,我可以想到两种方法:
使用3个字段生成用于映射对象的64位密钥。然而,这意味着每次访问都要将String解析为Hex(并且会有很多访问,需要很快)。
使用3个HashMap级别,每个级别嵌套在下一个级别中,以表示3个识别字段。
我的问题是这些方法中哪一种应该是最快的。
答案 0 :(得分:1)
我有一个建议给你。 使用将构成键的3个属性创建一个对象。使用对象有密钥,因为它是唯一的。
Map<ObjectKey,Object> map = new HashMap<>();
这对您的用例有意义吗?如果您可以添加更多解释,我可以进一步建议您可能的解决方案。
编辑:您可以使用这种逻辑覆盖等于并执行某些操作:
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Key))
return false;
ObjectKey objectKey= (Key) obj;
return this.key1.equals(objectKey.key1) && this.key2.equals(objectKey.key2) &&
...
this.keyN.equals(objectKey.keyN)
}
答案 1 :(得分:1)
为什么不使用MultiKeyMap? 这可能与您的问题无关。
答案 2 :(得分:0)
我会采取以下步骤:
您的密钥符合64位值。假设您将一次构建HashMap,然后多次读取它(使用它作为查找表),我的预感是使用Long
类型作为HashMap的键将与您一样快可以得到。
每次在地图中查找键时,都担心必须将字符串解析为十六进制数。有什么选择?如果使用包含三个单独字段的键,则仍需要解析字符串以计算其哈希码(或者,Java API实现将通过解析字符串内容来计算其哈希码)。 HashMap不仅会调用String.hashCode()
,还会调用String.equals()
,因此您的字符串将重复两次。相比之下,计算Long
并将其与HashMap中的预先计算的密钥进行比较将包括仅迭代字符串一次。
如果您使用三个HashMap
级别,根据您的第二个建议,您仍然需要计算字符串的哈希码,以及必须查找所有三个字段的值,所以多级地图不会给你带来任何性能优势。
您还应该尝试使用HashMap构造函数参数以获得最高效率。这些将决定您的数据如何有效地传播到不同的存储桶中。