有没有办法在对象键上使用 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
的键,因为数组不会覆盖 equals
和 hashCode
的默认实现。因此,两个不同的数组对象(例如您的 arr1
和 arr3
)不相等,即使它们包含完全相同的元素并且顺序相同。
您可以使用 List<Integer>
作为键而不是 int[]
。那行得通。
首先,不能在泛型中使用原始值。您的代码将无法编译。
其次,你不应该使用 mutable 值作为散列 table 键。
形式上,您可以使用List<Integer>
代替int[]
,但这会导致将来出现hard-to-debug错误。当您在哈希 table 中按键访问或搜索时,会为您的值计算一个哈希码,并在该哈希 table 的已知列表中搜索一个常数时间。如果您的代码更改了您使用键定义的对象,那么您将不再在散列 table.
中找到 key-value 对
我不建议您使用 List<Integer>
作为散列 table 键,尽管这会解决问题中描述的问题。
我有一个 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
的键,因为数组不会覆盖 equals
和 hashCode
的默认实现。因此,两个不同的数组对象(例如您的 arr1
和 arr3
)不相等,即使它们包含完全相同的元素并且顺序相同。
您可以使用 List<Integer>
作为键而不是 int[]
。那行得通。
首先,不能在泛型中使用原始值。您的代码将无法编译。
其次,你不应该使用 mutable 值作为散列 table 键。
形式上,您可以使用List<Integer>
代替int[]
,但这会导致将来出现hard-to-debug错误。当您在哈希 table 中按键访问或搜索时,会为您的值计算一个哈希码,并在该哈希 table 的已知列表中搜索一个常数时间。如果您的代码更改了您使用键定义的对象,那么您将不再在散列 table.
我不建议您使用 List<Integer>
作为散列 table 键,尽管这会解决问题中描述的问题。