我今天参加了一个面试,面试的人用他的说法迷惑了我,他问是否有可能TreeSet等于HashSet,而不是HashSet等于TreeSet。 我说不,但据他说,答案是肯定的。
怎么可能呢?
你的面试官是对的,他们对于一些特定的案例并不持对等关系。 treeset
可能等于hashset
,反之亦然。 下面是一个例子:
TreeSet<String> treeSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
HashSet<String> hashSet = new HashSet<>();
treeSet.addAll(List.of("A", "b"));
hashSet.addAll(List.of("A", "B"));
System.out.println(hashSet.equals(treeSet)); // false
System.out.println(treeSet.equals(hashSet)); // true
原因是treeset
使用比较器来确定元素是否重复,而hashset
使用equals
。
正在引用树集
:
注意,如果要正确实现set接口,set(无论是否提供显式比较器)所维护的顺序必须与equals一致。
如果不违反equals或Set的合同,那是不可能的。 Java对平等的定义要求对称,即。 aequals(b)
必须与bequals(a)
相同。
事实上,Set的文档说明
如果指定的对象也是一个集合,两个集合具有相同的大小,并且指定集合的每个成员都包含在此集合中(或者等价地,此集合的每个成员都包含在指定集合中),则返回true。 此定义确保equals方法在set接口的不同实现之间正常工作。