2016-05-16 7 views
1

"Contains"を印刷しようとしていますが、HashSetがInteger []値を検出していません。それは参照渡しされていると関係がありますか?実際のInteger []オブジェクトをメソッドの引数に渡したくない場合、これをどのように克服できますか?なぜ、このオブジェクトがHashSetに含まれていないと言っていますか?

import java.util.*; 

public class passByReference2{ 
    public static void method(HashSet<Integer[]> visited){ 
     Integer[] n = {1, 2}; 
     if (visited.contains(n)){ 
      System.out.println("Contains"); 
     } 
    } 

    public static void main(String[]args){ 
     HashSet<Integer[]> visited = new HashSet<Integer[]>(); 
     Integer[]v = {1, 2}; 
     visited.add(v); 
     method(visited); 
    } 


} 
+1

*のNothing * Javaは参照渡しされます。値渡しのみです。 –

答えて

4

アレイは要素を比較する方法でhashCodeを実装していないので、それはある - 実際には、アレイは全くhashCode(又はequals)を上書きしないので、Objectから実装が使用されています。

アレイのhashCodeおよびequalsは純粋に同一性に基づいています。


あなたは、例えば、それを「克服」要素の値に基づいてhashCodeequalsを計算タイプを使用したい場合ArrayList<Integer>

+1

彼らは 'equals'も実装していないので、' == 'を使うデフォルトの実装を継承します。 – user2357112

+0

@ user2357112 trueを更新しました。 –

0

Javaでは、デフォルトのhashCode実装では、オブジェクトのアドレスを使用します。

これは、典型的に整数にオブジェクトの内部アドレスを変換することによって実現されるが、この実装技術はのJavaTMプログラミング言語で必要とされない。)

hashCode() javadocs

関連する問題