我們經常使用的集合如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...