对于下面的代码,它输出“1”。第二个代码输出“ 2 ”我不明白为什么会发生这种情况。是因为我添加了相同的对象吗?我应该如何实现所需的输出2。
import java.util.*;
public class maptest {
public static void main(String[] args) {
Set<Integer[]> set = new HashSet<Integer[]>();
Integer[] t = new Integer[2];
t[0] = t[1] = 1;
set.add(t);
Integer[] t1 = new Integer[2];
t[0] = t[1] = 0;
set.add(t);
System.out.println(set.size());
}
}
第二个代码:
import java.util.*;
public class maptest {
public static void main(String[] args) {
Set<Integer[]> set = new HashSet<Integer[]>();
Integer[] t = new Integer[2];
t[0] = t[1] = 1;
set.add(t);
Integer[] t1 = new Integer[2];
t1[0] = t1[1] = 1;
set.add(t1);
System.out.println(set.size());
}
}
The Set
实现可能会调用t.hashCode()
并且由于数组不会覆盖Object.hashCode https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()方法,相同的对象将具有相同的哈希码。因此,更改数组的内容不会影响其哈希码。要正确获取数组的哈希码,您应该调用Arrays.hashCode https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#hashCode(int%5B%5D).
无论如何,你都不应该真正将可变的东西放入集合中,所以我建议你将不可变的列表放入集合中。如果您想坚持使用数组,只需创建一个新数组,就像您所做的那样t1
,并将其放入集合中。
EDIT:
对于代码 2,t
and t1
是两个不同的数组,因此它们的哈希码不同。再次强调,自从hashCode
方法在数组中不会被覆盖。数组的内容不会影响哈希码,无论它们是否相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)