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!!

为什么输出 1 是“找到”而输出 2 是“未找到”?这意味着如果键是字符串数组,则 HashMap 无法识别它的键,但如果键是字符串,那么它就可以了。

我需要将一个String数组放入HashMap的key中,那么如何让HashMap识别String数组的key呢?

4

3 回答 3

4

问题是数组是一个新实例,Object即使两个数组具有相同数量的元素,它们的哈希码也会不同。

简而言之,使用数组作为Map( HashMap,LinkedHashMap等) 的键是一个坏主意。请改用其他密钥。

于 2013-05-16T05:30:26.110 回答
3

HashMap使用equals(Object obj)hashCode()方法来保存和检索对象HashMap,String 类覆盖这些方法,而 String[] 是一个对象,并且在将其放入 HashMap 后不会如此,因为 String[]hashCode()并且equals(Object obj)运行了 Object 类的默认实现,这会导致不可预测的结果

于 2013-05-16T05:30:08.940 回答
1

变量名错误。在 if 条件下更改testTreetestTree2

            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);

            if (testTree2.containsKey(k2)){
                System.out.println("found!!");
            }
            else
                System.out.println("No found!!");
于 2013-05-16T05:27:24.787 回答