如果密钥是字符串数组,为什么HashMap不识别它的密钥?

时间:2013-05-16 05:24:30

标签: java hashmap

让我们看看这些代码:

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是“找到”&amp; output2是“No found”?这意味着如果键是一个String数组,HashMap不会识别它的键,但如果键是一个String,那么它就没问题了。

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

3 个答案:

答案 0 :(得分:4)

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

简而言之,使用数组作为MapHashMapLinkedHashMap等)的关键是一个坏主意。改为使用不同的密钥。

答案 1 :(得分:3)

HashMap使用equals(Object obj)hashCode()方法来保存和检索来自HashMap的对象,String类会覆盖这些方法,而String []是一个对象,它不会这样把它放在HashMap中,对于String [] hashCode()equals(Object obj) defualt的Object类的实现运行,导致不可预测的结果

答案 2 :(得分:1)

变量名称错误。在if条件

中将testTree更改为testTree2
            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!!");