3

私は最近、メソッドを使用してint[]2つをマージしようとすると、Javaが明らかに値が異なる全体を飲み込むという問題を抱えています。100 万の大規模なデータセットでのみこの動作を観察するため、実際の小さな例はありません。HashSet<int[]>addAll

私の理解では、equalsとのhashCodeメソッドは、配列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[] のequalsandhashCodeメソッドは、int 配列への参照のコンテンツまたはポインター値を尊重するように実装されていません。

これは、equalshashCodeがポインタ値を尊重するが、値は尊重しないことを意味します。

Java があなたのint[].

  1. あなたがHashSet複数のスレッドから埋めている場合。HashSet同期されていません。次のように作成する必要があります: Collections.synchronizedSet(new HashSet<int[]>()). 何百万ものオブジェクトがあるため、追加時に衝突が発生する可能性は非常に高くなります。
  2. 配列は変更可能なオブジェクトです。読み取り時に古い配列インスタンスを使用している場合、プログラムにバグがある可能性があります。
于 2013-09-13T19:18:32.593 に答える