無序性不等於隨機性。儲存的資料在底層陣列中並非照陣列索引的順序新增,而是根據資料的雜湊值決定的。
@test
public
void
test()
}
保證新增的元素照equals()
判斷時,不能返回true
,即相同的元素只能新增乙個。
@test
public
void
test()
}
我們向hashset
中新增元素a
,首先呼叫元素a
所在類的hashcode()
方法,計算元素a
的雜湊值,此雜湊值接著通過某種演算法計算出在hashset
底層陣列中的存放位置(即索引位置,判斷陣列此位置上是否已經元素):
hashset
底層:陣列+鍊錶的結構。
hashcode()
方法計算雜湊值
public
static
inthashcode
(object a)
之所以自動生成的係數是31,是因為選擇係數的時候要選擇盡量大的係數。因為如果計算出來的hash位址越大,所謂的「衝突」就越少,查詢起來效率也會提高(減少衝突)。並且31只占用5bits,相乘造成資料溢位的概率較小。
31可以 由i*31== (i<<5)-1
來表示,現在很多虛擬機器裡面都有做相關優化(提高演算法效率)。
31是乙個素數,素數作用就是如果我用乙個數字來乘以這個素數,那麼最終出來的結果只能被素數本身和被乘數還有1來整除!(減少衝突)。
person
類繼承comparable
介面,重寫compareto()
方法,按照名字從小到大排序。自然排序中,比較兩個物件是否相同的標準為compareto()
返回0
.不再是equals()
.
@override
public
intcompareto
(object o)
else
}
@test
public
void
test1()
}
定製排序中,比較兩個物件是否相同的標準為compare()
返回0
.不再是equals()
.
@test
public
void
test2()
else}}
; treeset set =
newtreeset
(comparator)
; set.
add(
newperson
("bb",22
)); set.
add(
newperson
("aa",23
)); set.
add(
newperson
("cc",22
)); iterator iterator = set.
iterator()
;while
(iterator.
hasnext()
)}
Collection子介面 List介面
3.常用實現類 4.原始碼分析 難點 4.2 linkedlist的原始碼分析 4.3 vector的原始碼分析 5.儲存的元素的要求 1.儲存的資料特點 儲存序的 可重複的資料。2.常用方法 記住 增 add object obj 刪 remove int index remove object ...
Collection子介面 Set介面
1.儲存的資料特點 無序的 不可重複的元素 具體的以hashset為例說明 無序性 不等於隨機性。儲存的資料在底層陣列中並非照陣列索引的順序新增,而是根據資料的雜湊值決定的。不可重複性 保證新增的元素照equals 判斷時,不能返回true.即 相同的元素只能新增乙個。2.元素新增過程 以hashs...
collection的子介面set
set介面 特點 無序,不可重複!允許null元素1.hashset 內部封裝hashmap 非執行緒安全a.首先判斷hashcode 使用物件的hashcode來判斷物件加入的位置,同時也會與其他已經加入的物件的hashcode進行 比較,如果沒有相等的hashcode,hashset就會假設物件...