Java ArrayList<;X>;在HashMap中用作键,但X[]的数组不';行不通

Java ArrayList<;X>;在HashMap中用作键,但X[]的数组不';行不通,java,arrays,collections,hashmap,Java,Arrays,Collections,Hashmap,当我试图将数组和arraylist作为键放入映射时,遇到了这个问题。 第一段代码: LinkedHashMap<ArrayList<String>, String> lhm = new LinkedHashMap<ArrayList<String>, String>(); for (int i =0;i < strs.length; i++){ ArrayList<String> arr =

当我试图将数组和arraylist作为键放入映射时,遇到了这个问题。 第一段代码:

        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]);
    }
LinkedHashMap lhm=new LinkedHashMap();
对于(int i=0;i
第二段代码:

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]);
    }
LinkedHashMap lhm=new LinkedHashMap();
对于(int i=0;i
第一段代码的工作原理与预期一样,每当我放置一个重复的键(Arraylist作为相同内容的键),它就会覆盖上一个键的值。 但第二件事并没有如预期的那样奏效。它只是把所有的价值都放进去了。 有人能解释一下这是怎么回事吗?
将Array/ArrayList(或者集合作为键)放在一起是一种好的做法吗

Java中的数组使用从对象继承的默认equals方法。hashCode方法也是如此。因此,即使将数组中的元素与键相同,最终也会出现“重复”。另一方面,列表重写hashcode方法,以返回更能代表其内容的值

在任何情况下,在hashmap中使用可变对象作为键通常都不是一个好主意,尽管在某些情况下这是不可避免的。特别是使用集合作为键可能会以多种方式绊倒您

  • 向列表中添加元素
  • 改变列表中的对象,使其哈希代码/相等约定发生变化

在地图中使用可变对象作为键很少是个好主意……我不知道你想赚多少钱,你能更具体一点吗?如果你想要同一个键有不同的值,你可以使用Guava库的多重映射。@pst:是的,我相信这是真的。但是我只想“懒惰”一次,所以我没有使用“array.toString”作为键,而是将数组本身作为键。@马丁:我只是将数组和arraylist作为键(我认为这不是一个好的做法)。arraylist作为一个键可以很好地工作,但是array不能。
Arrays.asList()
已经提供了一个
列表
,您不需要创建一个新的
arraylist
@pst-同意。在这种情况下,问题在于动词,而不是名词。我调低了一些“修辞”。@好的,数组不会覆盖hashcode()和equals()函数。所以,Map认为它们是不同的键。明白了,谢谢