2

これらのコードを見てみましょう:

HashMap<String, List<String>> testTree = new HashMap<String, List<String>>();                
String k = new String("1");
String v = new String("2");
List<String> children = new ArrayList<String>();
children.add(v);
testTree.put(k, children);
if (testTree.containsKey("1")){
    System.out.println("found!!");
}
else
    System.out.println("No found!!");

出力 1:found!!

HashMap<String[], List<String[]>> testTree2 = new HashMap<String[], List<String[]>>();                    
String[] k2 = {"1","2"};
String[] v2 = {"2","3"};
List<String[]> children2 = new ArrayList<String[]>();
children2.add(v2);
testTree2.put(k2, children2);

String[] k3 = {"1","2"};
if (testTree.containsKey(k3)){
    System.out.println("found!!");
}
else
    System.out.println("No found!!");

出力 2:No found!!

output1 が「見つかりました」& output2 が「見つかりません」になるのはなぜですか? キーが文字列配列の場合、HashMap はそのキーを認識しないことを意味しますが、キーが文字列の場合は問題ありません。

String 配列を HashMap のキーに入れる必要があるのですが、HashMap に String 配列キーを認識させるにはどうすればよいでしょうか?

4

3 に答える 3

4

問題は、配列が の新しいインスタンスでObjectあり、2 つの配列の要素数が同じであっても、それらのハッシュコードが異なることです。

つまり、配列をMap( HashMapLinkedHashMapなど) のキーとして使用するのは悪い考えです。代わりに別のキーを使用してください。

于 2013-05-16T05:30:26.110 に答える
3

HashMapequals(Object obj)およびメソッドを使用しhashCode()て からオブジェクトを保存および取得します。String クラスはHashMapこれらのメソッドをオーバーライドしますが、String[] はオブジェクトであり、HashMap に配置した後は String[]hashCode()およびequals(Object obj)Object クラスによる defualt の実装が実行され、予測できない結果が発生します。

于 2013-05-16T05:30:08.940 に答える