繁体   English   中英

Java Set的唯一对象标识

[英]Unique object identification of Java Set

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

这取决于Set实现。 对于HashSetLinkedHashSet ,它同时使用equalshashCode方法。 对于TreeSet ,它使用对象的自然Comparator或提供的特定Comparator

基本上, Set javadoc对此进行了解释(强调我的意思):

不包含重复元素的集合。 更正式地说, 集合不包含元素对e1和e2,使得e1.equals(e2)最多包含一个null元素 顾名思义,此接口对数学集合抽象进行建模。

除了从Collection接口继承的规定外 ,Set接口对所有构造函数的协定以及add, equals和hashCode方法的协定附加了其他规定

TreeSet具有另一个行为,因为它实现了SortedSet (此接口扩展了Set接口)。 从其javadoc(重点是我的):

一个Set,进一步提供其元素的总体排序。 元素使用其自然顺序或通过通常在排序集创建时提供的Comparator进行排序。 集合的迭代器将以升序顺序遍历集合。)

请注意,如果排序集要正确实现Set接口,则排序集(无论是否提供显式比较器)所维护的顺序必须与equals一致(有关与以下内容一致的精确定义,请参见Comparable接口或Comparator接口)。之所以这样,是因为Set接口是根据equals操作定义的,但是排序后的set使用其compareTo(或compare)方法执行所有元素比较。

HashSet源:似乎元素作为键存储在HashMap (需要唯一键),并且HashMapput方法检查以下内容:

if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

因此,它同时比较哈希值和运行equals

TreeSet中使用树状图中备份其数据和树状图put采用了比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM