3

当我尝试使用该方法int[]合并两个值时,我最近遇到了 Java 显然吞下整个值的问题。我没有一个小的工作示例,因为我只在一百万的大型数据集中观察到这种行为。HashSet<int[]>addAll

我的理解是,并没有实现equalshashCode方法来尊重对数组int[]的引用的内容或指针值。int有没有办法修改HashSetint[]包装它,使其安全工作HashSet<int[]>

4

1 回答 1

4

下一个程序:

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[] 的equalshashCode方法未实现以尊重对 int 数组的引用的内容或指针值。

这意味着equalsandhashCode确实尊重指针值,但不尊重值。

我看到 Java 吞并您的int[].

  1. 如果您HashSet要从多个线程中填充。HashSet不同步。您需要按以下方式创建它:Collections.synchronizedSet(new HashSet<int[]>()). 由于您拥有数百万个对象,因此添加时发生碰撞的可能性非常高。
  2. 数组是一个可修改的对象。如果在读取时使用旧数组实例,您的程序中可能存在错误。
于 2013-09-13T19:18:32.593 回答