为什么 HashSet 说它不包含这个对象?
Why does HashSet say it does not contain this Object?
我正在尝试打印 "Contains",但是 HashSet 没有检测到 Integer[] 值。它与它被引用传递有关吗?如果我不想将实际的 Integer[] 对象传递给方法的参数,我该如何克服这个问题?
import java.util.*;
public class passByReference2{
public static void method(HashSet<Integer[]> visited){
Integer[] n = {1, 2};
if (visited.contains(n)){
System.out.println("Contains");
}
}
public static void main(String[]args){
HashSet<Integer[]> visited = new HashSet<Integer[]>();
Integer[]v = {1, 2};
visited.add(v);
method(visited);
}
}
这是因为数组没有以比较元素的方式实现 hashCode
- 事实上,数组根本不会覆盖 hashCode
(或 equals
),所以使用了 Object
的实现。
数组的 hashCode
和 equals
完全基于标识。
如果你想 "overcome" 它,使用一个基于元素值计算 hashCode
和 equals
的类型,例如ArrayList<Integer>
.
在 Java 中,默认 hashCode
实现是使用对象的地址。
This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)
我正在尝试打印 "Contains",但是 HashSet 没有检测到 Integer[] 值。它与它被引用传递有关吗?如果我不想将实际的 Integer[] 对象传递给方法的参数,我该如何克服这个问题?
import java.util.*;
public class passByReference2{
public static void method(HashSet<Integer[]> visited){
Integer[] n = {1, 2};
if (visited.contains(n)){
System.out.println("Contains");
}
}
public static void main(String[]args){
HashSet<Integer[]> visited = new HashSet<Integer[]>();
Integer[]v = {1, 2};
visited.add(v);
method(visited);
}
}
这是因为数组没有以比较元素的方式实现 hashCode
- 事实上,数组根本不会覆盖 hashCode
(或 equals
),所以使用了 Object
的实现。
数组的 hashCode
和 equals
完全基于标识。
如果你想 "overcome" 它,使用一个基于元素值计算 hashCode
和 equals
的类型,例如ArrayList<Integer>
.
在 Java 中,默认 hashCode
实现是使用对象的地址。
This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)