HashMap - 使用包含多个字段的密钥进行最快速的访问

时间:2017-07-11 10:57:56

标签: java hashmap

我有一个由3个字段标识的对象。一个是表示6个十六进制字节的字符串,另外两个是每个不超过1个字节的整数。总而言之,这是8个字节的数据,适合64位整数。

我需要映射这些对象以便快速访问,我可以想到两种方法:

  • 使用3个字段生成用于映射对象的64位密钥。然而,这意味着每次访问都要将String解析为Hex(并且会有很多访问,需要很快)。

  • 使用3个HashMap级别,每个级别嵌套在下一个级别中,以表示3个识别字段。

我的问题是这些方法中哪一种应该是最快的。

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)

我会采取以下步骤:

  1. 首先以最易读的方式编写,然后对其进行分析。
  2. 将其重构为您认为可能更快的实现,然后再次对其进行配置。
  3. 进行比较。
  4. 重复。
  5. 您的密钥符合64位值。假设您将一次构建HashMap,然后多次读取它(使用它作为查找表),我的预感是使用Long类型作为HashMap的键将与您一样快可以得到。

    每次在地图中查找键时,都担心必须将字符串解析为十六进制数。有什么选择?如果使用包含三个单独字段的键,则仍需要解析字符串以计算其哈希码(或者,Java API实现将通过解析字符串内容来计算其哈希码)。 HashMap不仅会调用String.hashCode(),还会调用String.equals(),因此您的字符串将重复两次。相比之下,计算Long并将其与HashMap中的预先计算的密钥进行比较将包括仅迭代字符串一次。

    如果您使用三个HashMap级别,根据您的第二个建议,您仍然需要计算字符串的哈希码,以及必须查找所有三个字段的值,所以多级地图不会给你带来任何性能优势。

    您还应该尝试使用HashMap构造函数参数以获得最高效率。这些将决定您的数据如何有效地传播到不同的存储桶中。