【问题标题】:Is there a way to use the containsKey() map function on an Object key?有没有办法在 Object 键上使用 containsKey() 映射函数?
【发布时间】:2021-01-04 01:32:02
【问题描述】:

我有一个哈希图,其中包含一个整数数组作为键和一个整数作为值的条目。当我将整体添加到 hashmap 时,我创建整数数组变量,然后在 hashmap.put() 调用中使用变量名。问题是我稍后需要搜索 hashmap 键以查看给定的整数数组键是否存在,但 hashmap.containsKey() 调用总是返回 false,因为 hashmap 包含对整数数组的引用,而不是实际的显式整数数组.

有没有一种简单的方法可以使用给定的整数数组搜索哈希图?

代码片段如下:

public static void main (String[] args) {

    Map<int[], Integer> map = new HashMap<int[], Integer>();
    int[] arr1 = {1, 2, 3, 4};
    int[] arr2 = {5, 6, 7, 8};
    map.put(arr1, 1);
    map.put(arr2, 2);
    int[] arr3 = {1, 2, 3, 4};
    System.out.println(map.containsKey(arr3));

}

【问题讨论】:

    标签: java arrays hashmap


    【解决方案1】:

    数组不适合作为HashMap 的键,因为数组不会覆盖equalshashCode 的默认实现。因此,两个不同的数组对象(例如您的arr1arr3)并不相等,即使它们包含完全相同的元素且顺序相同。

    您可以使用List&lt;Integer&gt; 代替int[] 作为键。这会起作用的。

    【讨论】:

      【解决方案2】:

      首先,您不能在泛型中使用原始值。您的代码将无法编译。

      其次,你不应该使用可变值作为哈希表键。

      形式上,您可以使用List&lt;Integer&gt; 而不是int[],但这会导致将来难以调试的错误。当您在哈希表中通过键访问或搜索时,会为您的值计算一个哈希码,并在已知此哈希表的列表中搜索一个常数时间。如果您的代码更改了您使用该键定义的对象,那么您将不再在哈希表中找到该键值对。

      我不建议你使用List&lt;Integer&gt;作为哈希表键,虽然这样可以解决问题中描述的问题。

      【讨论】:

      • 那么 Array 是如何成为原始类型的?
      • 那么钥匙有什么更好的选择呢?它必须包含可变数量的整数(一些键只有 1,而其他键可能是 3 或 4 个整数)。
      • @iandeboo 这个问题已经回答了。使用列表...无论哪种方式,如果您要使用 Collection 继承者或相似,请确保它是不可变的...
      • @iandeboo,你可以使用来自 Guava 的com.google.common.collect.ImmutableList
      • 如果您在添加第 3 方依赖项时遇到问题,只需使用 Collections.unmodifiableList(yourList)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多