簡體   English   中英

如何在內部避免重復?

[英]How sets avoid duplicates internally?

我對Collections框架中的set有疑問。 集合本身將如何識別重復項以及它將如何識別? 誰能解釋一下它是如何實現的? 哈希碼和等於方法將如何進入圖片? 我需要一個簡短的解釋,因為它對我來說非常重要。

它大致類似於此

if (!collection.contains(element))
    collection.add(element);

而contains方法,將使用equals / hashcode。

在TreeSet中,元素存儲在紅黑樹中,而HashSet使用HashMap。

事實上,它添加到容器的方式特定於元素(樹上的點,哈希表中的桶),因此添加本身使用equals / hashcode。

這在Setjavadoc中有解釋

不包含重復元素的集合。 更正式地說,集合不包含元素對e1和e2,使得e1.equals(e2)和至多一個null元素。

HashSet使用hashcode()解析對象應該去的bucket和equals()方法來檢查位於該bucket上的對象的相等性

實際的實現取決於容器。 HashMap在給定hashCode查找項目,然后使用equals測試插入的對象和存儲的對象(這是要求a.equals(b) iff b.equals(a) )的原因之一。

TreeMap ,在另一方面,依賴於結果compareTo方法(如果該元件實現Comparablecompare用實施的方法Comparator )。 如果compare返回0,則元素被視為“等於”。 (注意, compareTo應該與equals一致 ,即a.compareTo(b)==0 iff a.equals(b) )。

“你可以用這些例子來解釋.s.add(”123“); s.add(”123“);”

對於上面使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM