[英]Unique object identification of Java Set
在Java中,Set不能包含两个唯一的对象,因为List没有该限制。 集合中用于标识唯一对象的机制是什么? 最有可能是equals方法或hashCode方法的实现,或正在添加的两个对象的实现。 有谁知道识别唯一对象的实际机制是什么? 是equals方法,hashcode方法还是这两种方法或其他方法?
这取决于Set
实现。 对于HashSet
和LinkedHashSet
,它同时使用equals
和hashCode
方法。 对于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
(需要唯一键),并且HashMap
的put
方法检查以下内容:
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
因此,它同时比较哈希值和运行equals
。
TreeSet中使用树状图中备份其数据和树状图put
采用了比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.