2

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

第二段代码:</p>

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 作为相同内容的键)时,它都会覆盖前一个键的值。但第二部分没有按预期工作。它只是把所有的价值都放进去。任何人都可以解释这是如何工作的吗?将 Array/ArrayList(或者集合作为键)是一个好习惯吗?

4

1 回答 1

5

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

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

  • 向列表中添加元素
  • 改变列表中的对象,以改变它们的 hashCode/equality contract 的方式
于 2013-02-20T23:39:04.793 回答