[英]How sets avoid duplicates internally?
我對Collections框架中的set有疑問。 集合本身將如何識別重復項以及它將如何識別? 誰能解釋一下它是如何實現的? 哈希碼和等於方法將如何進入圖片? 我需要一個簡短的解釋,因為它對我來說非常重要。
它大致類似於此
if (!collection.contains(element))
collection.add(element);
而contains方法,將使用equals / hashcode。
在TreeSet中,元素存儲在紅黑樹中,而HashSet使用HashMap。
事實上,它添加到容器的方式特定於元素(樹上的點,哈希表中的桶),因此添加本身使用equals / hashcode。
HashSet
使用hashcode()
解析對象應該去的bucket和equals()
方法來檢查位於該bucket上的對象的相等性
實際的實現取決於容器。 HashMap
在給定hashCode
查找項目,然后使用equals
測試插入的對象和存儲的對象(這是要求a.equals(b)
iff b.equals(a)
)的原因之一。
TreeMap
,在另一方面,依賴於結果compareTo
方法(如果該元件實現Comparable
或compare
用實施的方法Comparator
)。 如果compare
返回0,則元素被視為“等於”。 (注意, compareTo
應該與equals一致 ,即a.compareTo(b)==0
iff a.equals(b)
)。
對於上面使用Set界面解釋的查詢,請參考下面的代碼片段和說明。
public void setTest() {
Set<String> obj = new HashSet<>();
System.out.println(obj.add("123")); //Output : true
System.out.println(obj.add("123")); //Output : false
}
如果您在上面的代碼段中注意到,我們已經添加了兩次123。 第一次添加SOP將返回true。 然后第二次添加“123”,SOP將返回false。
有了這個,我們可以理解, 如果我們第二次在Set中添加相同的值,那么將跳過重復的值 。
基本上set是一個有很多不同實現的接口,讓我們暫時使用HashSet實現,回答你的問題,我下載了源代碼並進入了HashSet類,然后我搜索了add方法並看到它使用HashMap來存儲唯一值。 它使用值作為HashMap的鍵和key的相應值(即下面代碼片段中的PRESENT)作為常量值(此值是虛擬值),我們都知道map的鍵是唯一的。 這就是它的工作原理。 代碼如下:
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.