Java Set的唯一对象标识

时间:2013-06-05 05:11:06

标签: java collections set

在Java中,Set不能包含两个唯一对象,其中List没有该限制。 Set中用于标识唯一对象的机制是什么。最有可能的是它可能是equals方法或hashCode方法的实现,或者是两个正在添加的对象。有谁知道识别独特物体的实际机制是什么。它是equals方法,hashcode方法还是两种方法或其他东西?

2 个答案:

答案 0 :(得分:4)

这取决于Set实施。对于HashSetLinkedHashSet,它使用equalshashCode方法。对于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使用比较器。