当我尝试使用该方法int[]
合并两个值时,我最近遇到了 Java 显然吞下整个值的问题。我没有一个小的工作示例,因为我只在一百万的大型数据集中观察到这种行为。HashSet<int[]>
addAll
我的理解是,并没有实现equals
和hashCode
方法来尊重对数组int[]
的引用的内容或指针值。int
有没有办法修改HashSet
或int[]
包装它,使其安全工作HashSet<int[]>
?
当我尝试使用该方法int[]
合并两个值时,我最近遇到了 Java 显然吞下整个值的问题。我没有一个小的工作示例,因为我只在一百万的大型数据集中观察到这种行为。HashSet<int[]>
addAll
我的理解是,并没有实现equals
和hashCode
方法来尊重对数组int[]
的引用的内容或指针值。int
有没有办法修改HashSet
或int[]
包装它,使其安全工作HashSet<int[]>
?
下一个程序:
final int[] a1 = { 1 };
final int[] a2 = { 1 };
final int[] a3 = a1;
System.out.println("a1.equals(a2): " + a1.equals(a2));
System.out.println("a1.equals(a3): " + a1.equals(a3));
输出:
a1.equals(a2): false
a1.equals(a3): true
关于您的留言:
我的理解是 int[] 的
equals
和hashCode
方法未实现以尊重对 int 数组的引用的内容或指针值。
这意味着equals
andhashCode
确实尊重指针值,但不尊重值。
我看到 Java 吞并您的int[]
.
HashSet
要从多个线程中填充。HashSet
不同步。您需要按以下方式创建它:Collections.synchronizedSet(new HashSet<int[]>())
. 由于您拥有数百万个对象,因此添加时发生碰撞的可能性非常高。