Acc*_*ier 2 java arrays collections hashmap
当我试图将数组和arraylist作为键放在Map中时,我遇到了这个问题.第一段代码:
LinkedHashMap<ArrayList<String>, String> lhm = new LinkedHashMap<ArrayList<String>, String>();
for (int i =0;i < strs.length; i++){
ArrayList<String> arr = new
ArrayList<String>(Arrays.asList(strs[i].toLowerCase().split(" ")));
Collections.sort(arr);
lhm.put(arr, strs[i]);
}
Run Code Online (Sandbox Code Playgroud)
第二段代码:
LinkedHashMap<String[], String> lhm = new LinkedHashMap<String[], String>();
for (int i =0;i < strs.length; i++){
String[] str = strs[i].toLowerCase().split(" ");
Arrays.sort(str);
System.out.println("***********");
for (String strin :str)
{
System.out.println(strin);
}
System.out.println("***********");
lhm.put(str, strs[i]);
}
Run Code Online (Sandbox Code Playgroud)
第一段代码按预期工作,每当我放入一个重复的键(Arraylist作为相同内容的键)时,它会覆盖前一个键的值.但第二部分没有按预期工作.它只是把所有的价值都放在里面.任何人都可以解释这是如何工作的?将Array/ArrayList(或者集合作为键)放入是一个好习惯吗?
Java中的数组使用从Object继承的默认equals方法.同样在hashCode方法上.因此,即使您的推送数组具有与键相同的元素,您最终也会得到"重复".另一方面,列表覆盖哈希码方法,以返回更能代表其内容的值.
在任何情况下,使用可变对象作为散列映射中的键通常是个坏主意,尽管在某些情况下它是不可避免的.特别是使用集合作为键可以以多种方式将您带走;