我想知道在java中是否可以为对象内的元素创建一个ID,所以如果使用相同的元素生成另一个对象,我可以检查它是否是私密创建的。
示例1 `
{
int[][] cha = new int[3][3];
cha[0][0] = 8;
cha[0][1] = 1;
cha[0][2] = 3;
cha[1][0] = 4;
cha[1][1] = 0;
cha[1][2] = 2;
cha[2][0] = 7;
cha[2][1] = 6;
cha[2][2] = 5;
int[][] hol = new int[3][3];
hol[0][0] = 8;
hol[0][1] = 1;
hol[0][2] = 3;
hol[1][0] = 4;
hol[1][1] = 0;
hol[1][2] = 2;
hol[2][0] = 7;
hol[2][1] = 6;
hol[2][2] = 5;
HashSet<int[][]> k = new HashSet();
k.add(cha);
System.out.println(k.contains(cha));
System.out.println(k.contains(hol));
}`
在这种情况下,我会得到值&#34; true,false&#34;即使两个矩阵都是相同的(我知道这是因为HashSet引用了内存地址而不是对象。)
我希望能够第二次创建矩阵并确定它是否已经创建。
感谢。
答案 0 :(得分:0)
将其包装在课堂中并定义您自己的equals()
和hashcode()
答案 1 :(得分:0)
我知道这是因为HashSet引用了内存地址而不是对象
不,那不是原因。原因是数组只与自身相等,因为数组不会覆盖{HAPSet用于检查已包含哪些元素的Object.equals()
和Object.hashCode()
方法。
要获得所需的行为,您需要将矩阵包装到您自己的类中,该类重写equals()和hashCode(),以便判断两个矩阵何时相等。确保在矩阵存储到HashSet中之后永远不要修改它的任何元素:
public final class Matrix {
private int[][] elements;
public Matrix(int[][] elements) {
this.elements = elements;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Matrix)) {
return false;
}
Matrix m = (Matrix) o;
return Arrays.deepEquals(this.elements, m.elements);
}
@Override
public int hashCode() {
return Arrays.deepHashCode(elements);
}
}
现在你可以做到
HashSet<Matrix> set = new HashSet<>();
Matrix m1 = new Matrix(cha);
k.add(m1);
System.out.println(set.contains(m1));
Matrix m2 = new Matrix(hol);
System.out.println(set.contains(m2));