gpt4 book ai didi

java - ArrayList 用作 HashMap 中的键,但 X[] 的数组不起作用

转载 作者:行者123 更新时间:2023-11-30 06:25:58 26 4
gpt4 key购买 nike

当我试图将数组和数组列表作为键放入 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]);
}

第二段代码:

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

第一段代码按预期工作,每当我放置重复键(Arraylist 作为相同内容的键)时,它都会覆盖前一个键的值。但是第二部分没有按预期工作。它只是把所有的值(value)都放在里面。任何人都可以解释这是如何工作的吗?将 Array/ArrayList(或者集合作为键)放在一起是一种好习惯吗?

最佳答案

Java 中的数组使用继承自 Object 的默认 equals 方法。同上 hashCode 方法。因此,即使您将数组与键的元素相同,您最终也会得到“重复项”。另一方面,列表会覆盖 hashcode 方法,以返回更能代表其内容的值。

在任何情况下,将可变对象用作 HashMap 中的键通常不是一个好主意,尽管在某些情况下这是不可避免的。尤其是使用集合作为键可能会以多种方式使您陷入困境;

  • 向列表中添加元素
  • 改变列表中的对象,以改变它们的 hashCode/equality contract 的方式

关于java - ArrayList<X> 用作 HashMap 中的键,但 X[] 的数组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14991917/

26 4 0