提问者:小点点

有没有可能treeset等于hashset而hashset不等于treeset


我今天参加了一个面试,面试的人用他的说法迷惑了我,他问是否有可能TreeSet等于HashSet,而不是HashSet等于TreeSet。 我说不,但据他说,答案是肯定的。

怎么可能呢?


共2个答案

匿名用户

你的面试官是对的,他们对于一些特定的案例并不持对等关系。 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接口的不同实现之间正常工作。