让我们看看这些代码:
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数组键呢?
答案 0 :(得分:4)
问题是数组是Object
的新实例,即使两个数组具有相同数量的元素,它们的哈希码也会不同。
简而言之,使用数组作为Map
(HashMap
,LinkedHashMap
等)的关键是一个坏主意。改为使用不同的密钥。
答案 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!!");