2017-04-25 11 views
0

ハッシュマップルックアップが失敗するのはなぜですか? 私はクローンを作成していますこのコードには、2番目のソースから鍵を受け取るコピーをシミュレートするためのキーを入力します。 keyとkey2は同じバイト配列です。ハッシュマップルックアップでnullが返される

コメントアウトされた部分から、実際にハッシュマップに値が含まれていることが確認できます。なぜ検索が失敗するのですか?

public class NewClass { 
    public static void main(String[] args) { 
     HashMap<byte [], String> lookupTable = new HashMap<>(); 

     byte[] key = new byte[32], key2; 
     SecureRandom sr = new SecureRandom(); 
     sr.nextBytes(key); 


     String value = Arrays.toString(key);   
     lookupTable.put(key, value); 


     key2 = key.clone(); 

     //System.out.println(Arrays.toString(key)); 
     //System.out.println(Arrays.toString(key2)); 

     System.out.println("Keys equal: "+ Arrays.equals(key2, key)); 

     String retrivedValue; 
     /* 
     Set<byte[]> keySet = lookupTable.keySet(); 
     for(byte[] k :keySet){ 
     System.out.println("key in map : "+ Arrays.toString(k)); 
     retrivedValue = keyLookupTable.get(k); 
     System.out.println("Test lookup sucessful:"+retrivedValue.equals(value)); 
     } 
     */ 
     retrivedValue = lookupTable.get(key2); 
     try { 
      System.out.println("Test lookup sucessful:" + retrivedValue.equals(value)); 
     } catch (NullPointerException e) {    
      System.out.println("retrivedValue is "+retrivedValue); 
     } 
    } 
} 

出力:

Keys equal: true 
retrivedValue is null 
+0

hashCodeメソッドとequalsメソッドを直接比較して、それらが一致するかどうかを確認します。クローン・メソッドの雑草もここで調べてください:https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone() – mba12

+0

プログラムアーティファクトの名前を選択するときは、 retrivedValue'という名前のパーツには、従来のスペルを使用するのがよいエンジニアリングです。これは、下流のメンテナンス中にバグが発生する可能性を低減します。 –

答えて

2

HashMapのルックアップは、2つの配列のために失敗した、Arrays.equalsを使用するつもりはなく、単に通常の.equalsされていません。

これは基本的にできませんマップキーとして配列を使用します。あなたは.equals実装のクラスでそれらをラップする必要があります。

+0

@Soumy、この答えのポイントは、 'equals'配列の実装は、値の比較ではなく、' Object'から継承したものと同じID比較を使用することです。つまり、たとえ2つの配列の内容が同じであっても、実際には同じ配列であれば等しいです。そうではありません。あなたが探していた配列は地図のキーセットにありませんでした。 http://docs.oracle.com/javase/specs/jls/se8/html/jls-10.html#jls-10.7 –

+0

OPの投稿からの私の推測は、彼らの例では 'Arrays.equals'を使用していたからです彼らは 'Object.equals'が配列に対して行ったことを理解しましたが、マップがどのようにそれらを使用したかは理解していませんでした。 –

+0

回避策の1つは、[ByteBuffers](http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#wrap-byte:A-)をキーとして使用することです.ByteBufferは、その内容を比較するequalsメソッド – VGR

関連する問題