它检查.hashCode
以找到存储桶,然后使用.equals
. 如果所有元素的顺序相同并且也是 ,则List.equals
返回。将为具有相同元素的两个实例返回相同的值,因此它会找到正确的存储桶,然后使用并查看列表的元素相同且顺序相同。true
.equals
ArrayList.hashCode
ArrayList
.equals
例如:
ArrayList<Integer> lis = new ArrayList<Integer>();
lis.add(2);
lis.add(3);
ArrayList<Integer> lis2 = new ArrayList<Integer>();
lis2.add(2);
lis2.add(3);
System.out.println(lis.equals(lis2)); // Prints "true"
还值得注意的是,您永远不应该使用可变对象作为HashMap
. 通过修改密钥,您可以导致其所在的存储桶无效。例如,如果我这样做:
map.put(lis, 7);
lis.add(3);
System.out.println(map.get(lis)); // Prints "null", *not* "7"
这是因为添加另一个元素会改变 的值lis.hashCode()
。当您put
列出列表时,hashCode
用于挑选一个桶。通过添加新元素,您可以更改它将使用的存储桶,但不会更改您已添加到地图中的条目的存储桶。添加到上述内容:
map.put(lis, 7);
lis.add(3);
map.put(lis, 7);
System.out.println(map.size()); // Prints "2"
它第二次解析为不同的存储桶,因此将其视为第二个元素。
在这种情况下,您将使用Collections.unmodifiableList
“冻结”列表,添加它,然后再也不碰它:
map.put(Collections.unmodifiableList(lis), 7);
然后,如果您致电get().add(3)
:
map.get(7).add(3);
这将抛出一个UnsupportedOperationException
.