Java中 判斷集合中的元素相等的依據 詳細解析

2021-07-26 14:45:09 字數 2109 閱讀 7795

我們經常使用的集合如arraylist,linkedlist,vector,

**你在呼叫contains()方法的時候, 或者是你在根據物件移除元素 remove(object o) 你知道他們是如何判斷集合中的元素是否

是相等的嗎**?

接下來我們跟著原始碼去詳細**一下

資料資料結構不同判斷的依據就不同,我們先來看一下list類的判斷依據.

先簡單的了解一下

list類 : 有序,可以有重複元素。

arraylist底層是乙個物件陣列

private transient object elementdata;

linkedlist屬於鏈式資料結構,底層用的是乙個node類的節點,包括指標域和資料域.

private static class node

}arraylist linkedlist他們都是執行緒不同步的 vector非常類似arraylist,但是vector是同步的。, arraylist linkedlist多執行緒訪問會丟擲 concurrentmodificationexception。如果想使他們執行緒同步的可以使用collections.synchronizedlist 方法將該集合「包裝」起來

回歸正題

我們想知道他們如何判斷集合元素是否相等,我們應該想到的是contains(object o)方法,接下來我們看一下contains(object o)方法

public

boolean

contains(object o)

他的方法內部呼叫了indexof(o)這個方法,我們繼續追蹤看一下indexof(o)方法

public

intindexof(object o) else

return -1;

}

看到這裡我們應該能明白了 先判斷要查詢的元素是否為空,不為空的話就呼叫equals方法.由此我們得到乙個結論

list類中判斷元素是否相等依賴的是equals方法.

set類 : 無序,不允許重複

hashset :

此實現不是同步的

我們知道hashset它不允許出現重複元素,他是如何保證元素唯一的呢,我們應該首先想到的是看他的add()方法

如下public boolean add(e e)

這裡出現了乙個map我們找找看看他是什麼

我們在上面看到了他的定義

private

transient hashmapmap;

現在我們知道了hashset的內部其實是乙個hashmap來維護的,眾所周知hashmap的鍵是不允許有相同的,不用說hashmap的鍵就是hashset的值,接下來我們只需要知道hashmap的鍵是如何保證唯一的就行了

我們就要追蹤hashmap的新增元素方法 put(k key, v value)

public v put(k key, v value) 

if (key == null)

return putfornullkey(value);

int hash = hash(key);

int i = indexfor(hash, table.length);

for (entrye = table[i]; e != null; e = e.next)

}

雖然有點麻煩我們只需要仔細看看 一定可以看明白 抓住最重要的一句

e.hash == hash && ((k = e.key) == key || key.equals(k))
現在我們也知道了hashset 和haspmap 保證元素唯一的辦法是 先比較兩個元素的雜湊值,如果雜湊值相等,在比較元素的位址是否相同,或者呼叫兩個元素的equals方法如果雜湊值不同,就根本不用在比較了.

C 判斷兩個集合中的元素是否相等

今天在寫介面時,需要根據當前傳入的集合資料,和上次傳入的集合資料是否相同,做出不同的邏輯處理.如果直接根據等號進行比較,是比較的記憶體位址,因為兩次傳入,有其中乙個是new建立的,所以肯定不相等。可以使用sequenceequal這個方法,非常實用 demo list long nums newli...

C 中相等性判斷

我們在想對乙個可列舉的物件集合進行去重操作時,一般第乙個想到的就是就是linq的distinct方法。先定義乙個類,然後使用distinct方法去重。class man public string name public string adress public decimal weight pub...

java中的集合

set hashset無序不重複,底層資料結構是雜湊表,執行緒非同步,保證元素唯一性原理是判斷hashcode值是否相同 位址相同 如果相同還會繼續判斷equals方法是否為true 是否是同乙個物件 treeset字典序不重複,底層資料是二叉樹,保證元素唯一性原理是compareto方法retur...