Collection子介面 Set介面

2021-10-17 16:11:47 字數 3142 閱讀 7437

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放到陣列中,指向原來的元素。

jdk 8 :原來的元素在陣列中,指向元素a

總結:七上八下

hashset底層:陣列+鍊錶的結構。(前提:jdk7)

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中新增的資料,要求是相同類的物件。

2.兩種排序方式:自然排序(實現comparable介面 和 定製排序(comparator)

6.2 常用的排序方式:

方式一:自然排序

@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就會假設物件...