在Java中,Set不能包含两个唯一对象,其中List没有该限制。 Set中用于标识唯一对象的机制是什么。最有可能的是它可能是equals方法或hashCode方法的实现,或者是两个正在添加的对象。有谁知道识别独特物体的实际机制是什么。它是equals方法,hashcode方法还是两种方法或其他东西?
答案 0 :(得分:4)
这取决于Set
实施。对于HashSet
和LinkedHashSet
,它使用equals
和hashCode
方法。对于TreeSet
,它使用对象的自然Comparator
或特定提供的Comparator
。
基本上,Set
javadoc解释了这一点(强调我的):
不包含重复元素的集合。更正式地,集合不包含元素对e1和e2,使得e1.equals(e2),并且最多只有一个null元素。正如其名称所暗示的,该界面对数学集抽象进行建模。
Set接口除了从Collection接口继承的那些之外,在所有构造函数的合同和add的合约上添加了 equals和hashCode方法之外的其他规定
TreeSet
有另一种行为,因为它实现了SortedSet
(此接口扩展了Set
接口)。从它的javadoc(强调我的):
进一步提供其元素的总排序的集合。元素按照它们的自然顺序排序,或者通过通常在排序集创建时提供的比较器排序。 set的迭代器将按升序元素顺序遍历集合。)
请注意,排序集维护的排序(无论是否提供显式比较器)必须与equals一致,如果排序集要正确实现Set接口(请参阅Comparable接口或Comparator接口以获得精确定义) 。这是因为 Set接口是根据equals操作定义的,但是一个有序集使用compareTo(或compare)方法执行所有元素比较。
答案 1 :(得分:0)
HashSet Source:似乎元素存储为HashMap
中的键(需要唯一键),而put
中的HashMap
方法会检查以下内容:
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
因此它比较了哈希并运行equals
。
TreeSet使用TreeMap支持其数据,TreeMaps put
使用比较器。