容器簡介


Collection
├List
│├LinkedList
│├ArrayList
│└Vector
 └Stack
└Set
Map
├Hashtable
├HashMap
 
└LinkedHashMap
└WeakHashMap
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

容器類彼此間的關係請看下圖

container

legacy表示遺留過期的意思。

1.容器類類庫分爲兩類

(1)Collection:最基本的集合接口,JDK不提供直接繼承自Collection的類,JDK提供的類都是繼承自Collection的“子接口”如List和Set。通常這些元素都服從某種規則。List必須保持元素特定的順序,而Set不能有重複元素。  

(2)Map:“鍵值對”對象,即其元素是成對的對象,最典型的應用就是數據字典。另外,Map可以返回其所有鍵組成的Set和其所有值組成的Collection,或其鍵值對組成的Set,並且還可以像數組一樣擴展多維Map,只要讓Map中鍵值對的每個“值”是一個Map即可。

2.Collection的迭代器

如何遍歷Collection中的每一個元素?不論Collection的實際類型如何,它都支持一個iterator()的方法,該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。迭代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列的底層結構。迭代器通常被稱爲“輕量級”對象,因爲創建它的代價小。  

Iterator是Java迭代器最簡單的實現,只能單向移動;爲List設計的ListIterator具有更多的功能,它可以從兩個方向遍歷List,也可以從List中插入和刪除元素。

(1)使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。 

(2)使用next()獲得序列中的下一個元素。

(3)使用hasNext()檢查序列中是否還有元素。

(4)使用remove()將迭代器新返回的元素刪除。  

典型的用法如下:

  1. Iterator it = collection.iterator(); // 獲得一個迭代子
  2. while(it.hasNext()) {
  3.          Object obj = it.next(); // 得到下一個元素
  4. }

3.List接口:有序 and 允許有相同的元素。實現List接口的常用類有LinkedList,ArrayList,Vector,Stack

4.Set接口:不允許有相同的元素。

(1)HashSet: 基於哈希表(可重寫equals()和hashCode())。爲快速查找而設計的Set。存入HashSet的對象必須定義hashCode()。 

(2)TreeSet: 基於紅黑樹(可重寫compareTo())。保持次序的Set。使用它可以從Set中提取有序的序列。 

(3)LinkedHashSet: 具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序)。於是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。  

5.Map接口:提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個value。

Map接口提供3種集合的視圖

(1)key-value映射集合 — entrySet() 返回包含映射的Set視圖。Set中的每個元素都是一個Map.Entry對象,可以使用getKey()和getValue()方法(還有一個setValue() 方法)訪問後者的鍵元素和值元素

(2)key集合 — keySet() 包含鍵的 Set 視圖。刪除 Set 中的元素還將刪除 Map 中相應的映射(鍵和值)

(3)value集合 — values() 包含值的 Collection 視圖。刪除 Collection 中的元素還將刪除 Map 中相應的映射(鍵和值)

問題到這裏並沒有結束,我們還必須獲得一個Iterator對象,進而取得相應的key-value映射、key和value。

Iterator keyValuePairs = aMap.entrySet().iterator();

Iterator keys = aMap.keySet().iterator();

Iterator values = aMap.values().iterator()

Map增刪方法

clear() 從 Map 中刪除所有映射 

remove(Object key) 從 Map 中刪除鍵和關聯的值 

put(Object key, Object value) 將指定值與指定鍵相關聯

Map訪問方法

get(Object key) 返回與指定鍵關聯的值 

containsKey(Object key) 如果 Map 包含指定鍵的映射,則返回true

containsValue(Object value) 如果此 Map 將一個或多個鍵映射到指定值,則返回 true

isEmpty() 如果 Map 不包含鍵-值映射,則返回 true 

size() 返回 Map 中的鍵-值映射的數目

6.HashTable和HashMap

(1)HashTable的方法是同步的,HashMap未經同步,所以在多線程場合要手動同步HashMap這個區別就像Vector和ArrayList一樣。(最主要的區別)

(2)HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以,只容許有一個null值的key,可以有多個null值的value)。

(3)HashTable有一個contains(Object value),功能和containsValue(Object value)功能一樣。

(4)HashTable使用Enumeration,HashMap使用Iterator。

(5)實現機制上的不同:哈希表不同

Hashtable和HashMap的內部數據結構相似:其基本內部數據結構是一個Entry數組 (transient Entry[] table)。數組元素爲實現Map.Entry<K,V>接口的類,Hashtable和HashMap各自實現了自己的Entry類。Entry包含一個Key-value對,以及一個next指針指向另一個Entry。多個Entry可以組成一個單向鏈表。

7.應用:一般情況下,HashMap能夠比Hashtable工作的更好、更快,主要得益於它的散列算法,以及沒有同步。應用程序一般在更高的層面上實現了保護機制,而不是依賴於這些底層數據結構的同步,因此,HashMap能夠在大多應用中滿足需要。推薦使用HashMap,如果需要同步,可以使用同步工具類將其轉換成支持同步的HashMap。

8.Map的效率:與Entry數組大小及負荷因子的選取有密切關係。選取適當的數組大小有利於Key-value對的散列分佈,並且,如果數組足夠大,將有效的減少重新調整數組的次數,提高效率。較小的負荷因子將佔用更多的空間,但降低衝突的可能性,從而將加快訪問和更新的速度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章