1. 程式人生 > >JAVA基礎——集合淺析

JAVA基礎——集合淺析

div 判斷 要求 ron .info val rowspan adding 雙向鏈表

Java 集合

什麽時候數組會顯得力不從心,沒法滿足需求,需要集合類呢?

  1. 不知道具體數據長度
  2. 需要自動排序
  3. 存儲鍵值對

當然,上面的情況不是絕對的,只是數組比較難滿足。這時集合類(也可稱為容器類)就顯示了它強大的功能。

集合類的分類(圖片轉自http://biancheng.dnbcw.info/1000wen/359774.html)

技術分享圖片

上圖中不包含Queue內容,部分Map的實現類未給出。

常見使用的有List、Set、Map及他們的實現類。

List、Set、Map接口及各實現類的特性

接口

特性

實現類

實現類特性

成員要求

List

線性、有序的存儲容器,可通過索引訪問元素

ArrayList

數組實現。非同步。

Vector

類似ArrayList,同步。

LinkedList

雙向鏈表。非同步。

Map

保存鍵值對成員

HashMap

基於哈希表的 Map 接口的實現,滿足通用需求

任意Object對象,如果修改了equals方法,需同時修改hashCode方法

TreeMap

默認根據自然順序進行排序,或者根據創建映射時提供的 Comparator進行排序

鍵成員要求實現caparable接口,或者使用Comparator構造TreeMap。鍵成員一般為同一類型。

LinkedHashMap

類似於HashMap,但叠代遍歷時取得“鍵值對”的順序是其插入順序或者最近最少使用的次序

與HashMap相同

IdentityHashMap

使用==取代equals()對“鍵值”進行比較的散列映射

成員通過==判斷是否相等

WeakHashMap

弱鍵映射,允許釋放映射所指向的對象

ConcurrentHashMap

線性安全的Map

Set

成員不能重復

HashSet

為快速查找設計的Set

元素必須定義hashCode()

TreeSet

保持次序的Set,底層為樹結構

元素必須實現Comparable接口

LinkedHashSet

內部使用鏈表維護元素的順序(插入的次序)

元素必須定義hashCode()

在滿足要求的情況下,Map應盡量使用HashMap,Set應盡量使用HashSet。

集合類的基本使用

List

技術分享圖片List基本操作

ArrayList和LinkedList的效率比較

技術分享圖片ArrayList添加元素的效率

執行時間比較

執行次數(在0號位置插入)

ArrayList所用時間(ms)

LinkedList所用時間(ms)

10000

31

0

20000

141

0

40000

484

16

80000

1985

0

160000

7906

0

320000

31719

16

執行次數(在尾部插入)

ArrayList所用時間(ms)

LinkedList所用時間(ms)

10000

0

0

20000

15

0

40000

0

0

80000

0

0

160000

0

15

320000

0

16

循環輸出次數(get(index)方法)

ArrayList所用時間(ms)

LinkedList所用時間(ms)

10000

93

204

20000

188

797

40000

328

2734

80000

688

13328

160000

1594

62313

320000

2765

太久了……

因為ArrayList底層由數組實現,在0號位置插入時將移動list的所有元素,在末尾插入元素時不需要移動。LinkedList是雙向鏈表,在任意位置插入元素所需時間均相同。所以在List中有較多插入和刪除操作的情況下應使用LinkedList來提高效率,而有較多索引查詢的時候使用ArrayList(使用增強型的for循環或Iterator遍歷LinkedList效率將提高很多)。

數組是一種很常見的數據結構,開始接觸編程的時候多數程序都和數組相關。剛開始接觸Java時也是一直使用數組寫一些程序,後來越來越覺得數組這東西沒法滿足需求了,這時一位“前輩”對我說了一句:不會用集合類就等於沒學過Java。然後才知道有集合類。

想想已經是3、4年前的事了,時間如白駒過隙啊。

什麽時候數組會顯得力不從心,沒法滿足需求,需要集合類呢?

  1. 不知道具體數據長度
  2. 需要自動排序
  3. 存儲鍵值對

當然,上面的情況不是絕對的,只是數組比較難滿足。這時集合類(也可稱為容器類)就顯示了它強大的功能。

集合類的分類(圖片轉自http://biancheng.dnbcw.info/1000wen/359774.html)

技術分享圖片

上圖中不包含Queue內容,部分Map的實現類未給出。

常見使用的有List、Set、Map及他們的實現類。

List、Set、Map接口及各實現類的特性

接口

特性

實現類

實現類特性

成員要求

List

線性、有序的存儲容器,可通過索引訪問元素

ArrayList

數組實現。非同步。

Vector

類似ArrayList,同步。

LinkedList

雙向鏈表。非同步。

Map

保存鍵值對成員

HashMap

基於哈希表的 Map 接口的實現,滿足通用需求

任意Object對象,如果修改了equals方法,需同時修改hashCode方法

TreeMap

默認根據自然順序進行排序,或者根據創建映射時提供的 Comparator進行排序

鍵成員要求實現caparable接口,或者使用Comparator構造TreeMap。鍵成員一般為同一類型。

LinkedHashMap

類似於HashMap,但叠代遍歷時取得“鍵值對”的順序是其插入順序或者最近最少使用的次序

與HashMap相同

IdentityHashMap

使用==取代equals()對“鍵值”進行比較的散列映射

成員通過==判斷是否相等

WeakHashMap

弱鍵映射,允許釋放映射所指向的對象

ConcurrentHashMap

線性安全的Map

Set

成員不能重復

HashSet

為快速查找設計的Set

元素必須定義hashCode()

TreeSet

保持次序的Set,底層為樹結構

元素必須實現Comparable接口

LinkedHashSet

內部使用鏈表維護元素的順序(插入的次序)

元素必須定義hashCode()

在滿足要求的情況下,Map應盡量使用HashMap,Set應盡量使用HashSet。

集合類的基本使用

List

技術分享圖片List基本操作

ArrayList和LinkedList的效率比較

技術分享圖片ArrayList添加元素的效率

執行時間比較

執行次數(在0號位置插入)

ArrayList所用時間(ms)

LinkedList所用時間(ms)

10000

31

0

20000

141

0

40000

484

16

80000

1985

0

160000

7906

0

320000

31719

16

執行次數(在尾部插入)

ArrayList所用時間(ms)

LinkedList所用時間(ms)

10000

0

0

20000

15

0

40000

0

0

80000

0

0

160000

0

15

320000

0

16

循環輸出次數(get(index)方法)

ArrayList所用時間(ms)

LinkedList所用時間(ms)

10000

93

204

20000

188

797

40000

328

2734

80000

688

13328

160000

1594

62313

320000

2765

太久了……

因為ArrayList底層由數組實現,在0號位置插入時將移動list的所有元素,在末尾插入元素時不需要移動。LinkedList是雙向鏈表,在任意位置插入元素所需時間均相同。所以在List中有較多插入和刪除操作的情況下應使用LinkedList來提高效率,而有較多索引查詢的時候使用ArrayList(使用增強型的for循環或Iterator遍歷LinkedList效率將提高很多)。

JAVA基礎——集合淺析