【发布时间】:2020-07-19 12:00:41
【问题描述】:
今天我在做一个问题,他们使用了类似的代码。
我很惊讶地看到这一点。我认为每个HashSet 都存储一个对象的哈希值,答案是 2。但是,这个 1 的答案。
谁能解释当我存储 ArrayList 的对象的 HashSet 时内部实际发生了什么以及为什么答案是 1 而不是 2?
import java.io.*;
import java.util.*;
class Code {
public static void main (String[] args) {
HashSet<ArrayList<Integer>> set=new HashSet<>();
ArrayList<Integer> list1=new ArrayList<>();
ArrayList<Integer> list2=new ArrayList<>();
list1.add(1);
list1.add(2);
list2.add(1);
list2.add(2);
set.add(list1);
set.add(list2);
System.out.println(set.size()); // 1
}
}
【问题讨论】:
-
看HashSet的Javadoc就行了
-
看看
equals和hashCode的AbstractList -
这是因为
equals()和hashCode()是如何为ArrayList实现的。 HashSet 使用这两个识别“重复”。还要注意contract between the two。 -
这能回答你的问题吗? How Set checks for duplicates? Java HashSet
-
来自文档如果两个对象根据equals(Object)方法相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果。 所以对于生成的两个列表相同的哈希码,当添加方法调用它时检查列表的哈希并丢弃为重复