好好溫習下java容器類

容器類是什麼?

如果你真的用java做過項目,那list和map你肯定用過很多了。我也是,但是我當我拿起書本才發現原來還有其他容器自己一直沒用到。首先來了解下容器的概念吧。

容器可以管理對象的生命週期、對象與對象之間的依賴關係,您可以使用一個配置文件(通常是XML),在上面定義好對象的名稱、如何產生(Prototype 方式或Singleton 方式)、哪個對象產生之後必須設定成爲某個對象的屬性等,在啓動容器之後,所有的對象都可以直接取用,不用編寫任何一行程序代碼來產生對象,或是建立對象與對象之間的依賴關係。

以上是百度的概念。我覺得太複雜了。簡單來說,當我們用一個對象來“存放”一組對象的時候,這個對象就是容器,而這一組對象就是容器裏面的一個元素。所有的容器類都來自java.util包中。

容器的分類

容器還有分類嗎?有的。容器有兩大類,分別是Collection(集合)和Map(映像)。其中Collection存放的是獨立的對象,Map存放的是一對的“鍵-值”對象。
代表對象集合的接口有:collection(抽象的集合),collection的2個子接口Set和List。
Map集合的接口有HashMap和TreeMap。關係如圖所示:



List

List保存的是有序的可以重複的對象。List重載了add()和addAll()方法。有幾個實現了這個接口的類:
AbstractList,ArrayList,LinkedList和Vector。我們經常使用的是ArrayList、LinkedList和Vector。
   ArrayList可以想象成一種可以自動增加容量可以存放不同類型對象的數組。
Vector和ArrayList很類似,它們最大的區別在於Vector是線程安全的,而ArrayList不是。因爲這個Vector在執行效率上會比ArrayList低,所以在使用時如果不考慮多線程的問題,優先選擇ArrayList是個好選擇。
  而ArrayList和Vector採用的都是數組的形式來保存對象的,所以很大的缺點是對它們進行刪除或者插入操作的時候非常麻煩。
 LinkedList將每個對象放在獨立的空間中,在每個空間中還保存有下一個鏈接的索引,在Java中提供的是雙向鏈接列表,所以它還保存着上一個鏈接的索引。在LinkedList中不支持快速隨機訪問,如果想訪問LinkedList中的第N個元素,必須從頭開始查找,然後跳過前面的N-1個原色。所以效率比較低下。

Set

Set接口與List接口不同的地方在於,它表示的是不重複的對象集合。
Set有AbstractSet、HashSet、LinkedHashSet、TreeSet這些子類。比較常用的是HashSet和TreeSet類,因爲可以快速查找指定的對象。

Map

Map用於存儲元素對,稱作“”鍵“”和“值”。一個Map不能包含重複的鍵,每個鍵最多隻能映射一個值。在Map中鍵和值的保存順序不是它們的插入順序。
Map用put(key,value)方法來添加一個值,用get(key)方法獲取key鍵相關聯的值。
containsKey(Object key)用來判斷某個Key是否存在。
Map允許null作爲一個值。

HashMap是Java爲Map提供的實現類。是查詢效率最高的Map。

Hashtable也是Map實現類。它們有兩點典型的區別:
Hashtable是一個線程安全的Map實現,但是HashMap是線程不安全的實現。所以HashMap比Hashtable的性能要高一點。但是如果有多餘的線程訪問同一個Map對象時,使用Hashtable實現類比較好。
Hashtable不允許使用null作爲key和value,如果嘗試把null值放進Hashtable中,會產生NullPointException異常。但是HashMap可以使用null作爲key或value。

感覺這篇博客寫了好久。總結這些容器還是總結不完所有的細節,只是一些重點。先這樣吧。以後在一篇博客講解一個容器類比較好。

由於技術水平有限,如果文章中有錯的地方,希望指出。如果有疑問,歡迎留言討論。謝謝!

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