1. 儲存的資料特點:無序的、不可重複的元素
具體的以hashset為例說明:
無序性
:不等於隨機性。儲存的資料在底層陣列中並非照陣列索引的順序新增,而是根據資料的雜湊值決定的。
不可重複性
:保證新增的元素照equals()判斷時,不能返回true.即:相同的元素只能新增乙個。
2. 元素新增過程:(以hashset為例)
我們向hashset中新增元素a,首先呼叫元素a所在類的hashcode()方法,計算元素a的雜湊值,此雜湊值接著通過某種演算法計算出在hashset底層陣列中的存放位置(即為:索引位置,判斷陣列此位置上是否已經元素):
如果此位置上沒其他元素,則元素a新增成功。 --
->情況1
如果此位置上其他元素b
(或以鍊錶形式存在的多個元素,則比較元素a與元素b的hash值:
如果hash值不相同,則元素a新增成功。--
->情況2
如果hash值相同,進而需要呼叫元素a所在類的equals
()方法:
equals
()返回true
,元素a新增失敗
equals
()返回false
,則元素a新增成功。--
->情況3
對於新增成功的情況2和情況3而言:元素a 與已經存在指定索引位置上資料以鍊錶的方式儲存
jdk 7 :元素a放到陣列中,指向原來的元素。hashset底層:陣列+鍊錶的結構。(前提:jdk7)jdk 8 :原來的元素在陣列中,指向元素a
總結:七上八下
3. 常用方法
set介面中沒額外定義新的方法,使用的都是collection中宣告過的方法。
4. 常用實現類:
|
----collection介面:單列集合,用來儲存乙個乙個的物件
|----set介面:儲存無序的、不可重複的資料 --
>高中講的「集合」
|----hashset:作為set介面的主要實現類;執行緒不安全的;可以儲存null值
|----linkedhashset:作為hashset的子類;遍歷其內部資料時,可以按照新增的順序遍歷
在新增資料的同時,每個資料還維護了兩個引用,記錄此資料前乙個資料和後乙個資料。對於頻繁的遍歷操作,linkedhashset效率高於hashset.|--
--treeset:可以照新增物件的指定屬性,進行排序。
5. 儲存物件所在類的要求:
hashset/linkedhashset:
要求:向set(主要指:hashset、linkedhashset)中新增的資料,其所在的類一定要重寫hashcode()和equals()
要求:重寫的hashcode()和equals()盡可能保持一致性:相等的物件必須具有相等的雜湊碼
重寫兩個方法的小技巧:物件中用作 equals() 方法比較的 field,都應該用來計算 hashcode 值。treeset:`
自然排序中,比較兩個物件是否相同的標準為:compareto()返回0.不再是equals().
定製排序中,比較兩個物件是否相同的標準為:compare()返回0.不再是equals().
6. treeset的使用
6.1 使用說明:
1.向treeset中新增的資料,要求是相同類的物件。6.2 常用的排序方式:2.兩種排序方式:自然排序(實現comparable介面 和 定製排序(comparator)
方式一:自然排序
@test
public
void
test1()
}
方式二:定製排序@test
public
void
test2()
else}}
; treeset set =
newtreeset
(com)
; set.
add(
newuser
("tom",12
)); set.
add(
newuser
("jerry",32
)); set.
add(
newuser
("jim",2
)); set.
add(
newuser
("mike",65
)); set.
add(
newuser
("mary",33
)); set.
add(
newuser
("jack",33
)); set.
add(
newuser
("jack",56
)); iterator iterator = set.
iterator()
;while
(iterator.
hasnext()
)}
1.集合collection中儲存的如果是自定義類的物件,需要自定義類重寫哪個方法?為什麼?
equals
()方法。 contains()
/remove()
/retainsall
() ….
list:equals
()方法
set:(hashset、linkedhashset為例):equals
()、hashcode()
(treeset為例):comparable:compareto
(object obj)
comparator:compare
(object o1,object o2)
Collection子介面 List介面
3.常用實現類 4.原始碼分析 難點 4.2 linkedlist的原始碼分析 4.3 vector的原始碼分析 5.儲存的元素的要求 1.儲存的資料特點 儲存序的 可重複的資料。2.常用方法 記住 增 add object obj 刪 remove int index remove object ...
Collection子介面 Set介面
無序性不等於隨機性。儲存的資料在底層陣列中並非照陣列索引的順序新增,而是根據資料的雜湊值決定的。test public void test 保證新增的元素照equals 判斷時,不能返回true,即相同的元素只能新增乙個。test public void test 我們向hashset中新增元素a,...
collection的子介面set
set介面 特點 無序,不可重複!允許null元素1.hashset 內部封裝hashmap 非執行緒安全a.首先判斷hashcode 使用物件的hashcode來判斷物件加入的位置,同時也會與其他已經加入的物件的hashcode進行 比較,如果沒有相等的hashcode,hashset就會假設物件...