簡體   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