有没有办法在对象键上使用 containsKey() 映射函数?

Is there a way to use the containsKey() map function on an Object key?

我有一个 hashmap,其条目包含一个整数数组作为键和一个整数作为值。当我将 entires 添加到 hashmap 时,我创建了整数数组变量,然后在 hashmap.put() 调用中使用变量名称。问题是我稍后需要搜索 hashmap 键以查看给定的整数数组键是否存在,但是 hashmap.containsKey() 调用总是 returns 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));

}

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

您可以使用 List<Integer> 作为键而不是 int[]。那行得通。

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

其次,你不应该使用 mutable 值作为散列 table 键。

形式上,您可以使用List<Integer>代替int[],但这会导致将来出现hard-to-debug错误。当您在哈希 table 中按键访问或搜索时,会为您的值计算一个哈希码,并在该哈希 table 的已知列表中搜索一个常数时间。如果您的代码更改了您使用键定义的对象,那么您将不再在散列 table.

中找到 key-value 对

我不建议您使用 List<Integer> 作为散列 table 键,尽管这会解决问题中描述的问题。