java的集合類是一種特別有用的工具,它可以用于存儲數量不等的多個對象,并可以實現常用的數據結構,如棧、隊列等。java集合還可以用于板寸具有映射關系的關聯數組。
java集合就像是一個容器,我們可以把多個對象(實際上是對象的引用,習慣上叫對象,)保存到集合容器中。在jdk1.5以前java集合會丟失容器中所有對象的數據類型,jdk1.5以后增加了泛型,java集合可以記住容器中對象的數據類型。
java集合大致可以分為三個體系:set list map.所有的集合類都位于java.util包下面。
collection接口
collection接口是list、 set、和queue接口的父接口。
collection所代表的是一種規則,它所包含的元素都必須遵循一條或者多條規則。如有些允許重復而有些則不能重復、有些必須要按照順序插入而有些則是散列,有些支持排序有些不支持排序。
一、list接口
list接口是collection接口的直接接口。list代表的是有序的collection,集合中的每個元素都有其對應的索引。list中允許有重復的元素,可以通過索引來訪問指定位置的集合元素。因為list集合默認按元素的添加順序設置元素的索引。
(1)arraylist、vector、stack
arraylist和vector作為list的兩個典型實現類,完全支持list的全部功能。
arraylist和vector類的底層都是基于數組來儲存集合元素,封裝了一個動態的object[]數組,是一種順序存儲的線性表。
arraylist和vector在用法上幾乎完全相同,只是vector在jdk1.0時就存在,它的方法名比較冗長、比arraylist包含的方法多,源碼比arraylist包含的源碼也多,arraylist的序列化實現比vector現在vector基本上被arraylist所取代了。
主要區別:arraylist是線程不安全的,vector是線程安全的。
如果需要在多線程環境下使用list集合,而且需要保證線程安全,依然可以避免使用vector,而是考慮將arraylist包裝成線程安全的集合類。java提供的collections工具類,通過該工具類synchronizelist方法即可以把arraylist包裝成線程安全的arraylist.
stack
vector提供了一個子類,它用于模擬“棧”這種數據結構,棧通常是先進后出的容器。stack提供了額外的5個方法,使得vector可以當做棧來使用。出棧pop,入棧push,訪問棧頂元素peek(),判斷棧是否為空empty(),檢測一個元素在堆棧中的位置serch().
(2)linkedlist
linkedlist是一個鏈式存儲的線性變,本質上是一個雙向鏈表,它不僅實現了list接口還實現了dueue接口(雙端隊列,既具有隊列的特征,也具有棧的特征),所以linkedlist不僅可以做雙向鏈表來使用,還可以當棧和隊列來使用。
linkedlist對元素的插入、刪除元素時速度非???。
linkdedlist也是非同步的。若要實現同步訪問,可以采取
list list = collections.synchronizelist(new linkedlist(.....));
(3)異同點對比
(1)arraylist和linkedlist
1)arraylist是基于動態數組實現的,linkedlist是基于雙向鏈表實現的。
2)arraylist比較適用于隨機存取,(可直接通過索引,linkedlist需要通過指針遍歷);linkedlist比較適用于增加刪除操作(對于單條的插入和刪除操作arraylist比linkedlist速度快,對于插入好人刪除操作,arraylist需要移動后面的所有元素。)
二、set接口
set是一種不允許包含相同元素的collection。它維持自己的內部排序,隨機訪問沒有任何意義。
(1)hashset
hashset是set接口的典型實現,hashset按hash算法來儲存集合中的元素,具有很好的存取和查找功能。
具有以下特點:
1)不保證元素的排列順序,有可能變化;
2)hashset不是同步的;
3)集合元素可以為空。
(2)treeset
treeset是sortedset接口的唯一實現,treeset可以確保元素處于排序狀態,treeset并不是根據元素的插入順序進行排序的,而是根據實際值進行排序。支持兩種排序方式:自然排序和定制排序。
(3)enumset
是為枚舉類設計的集合類,enumset不允許加入null元素。如果試圖插入null,會拋出空指針異常。
set的三個實現類都是現成不安全的。
三、map接口
map保存具有映射關系的數據,因此map集合里保存著兩組值,一組值用來保存map里的key,一組用來保存map里的value,key和value可以是任何引用類型的數據。
map里的key不允許重復,value可以重復。key和value之間存在單向的一對一的關系,通過指定的key,總能找到唯一的、確定的value。
(1)hashmap與hashtable
hashmap與hashtable都是map的典型實現類,他們之間的關系類似于arraylist和vector:hashtable是一個古老的map實現類,在jdk1.0時就出現了。
主要區別:
1)hashtable是一個線程安全的map實現,但是hashmap是線程不安全的實現,hashmap的性能要比hashtable高一些,盡量避免使用hashtable,多個線程訪問一個map對象又要保證線程安全時,可以使用collections中的方法把hashmap變成線程安全的。
2)hashtable不允許使用null作為key和value,如果試圖把null加入hashtable中,將會引發空指針異常。
(2)treemap
treemap是map的子接口sortedmap的的實現類,與treeset類似的是treemap也是基于紅黑樹對treemap中所有的key進行排序,從而保證key-value處于有序狀態,treemap也有兩種排序方式:
1)自然排序:treemap的所有key必須實現comparable接口,而且所有key應該是同一類的對象,否則會拋出classcastexception.
2)定制排序:創建treemap時,傳入一個comparator對象,該對象負責對treemap中所有的key進行排序。
由于treemap支持內部排序,所以通常要比hashmap和hashtable慢。
四、queue接口
queue模擬了隊列這種數據結構,隊列通常是“先進先出”的數據結構,通常不允許隨機訪問隊列中的元素。
queue常用的實現類:linkedlist和priorityqueue
(1)linkedlist
linkedlist它不僅實現了list接口還實現了dueue接口(雙端隊列,既具有隊列的特征,也具有棧的特征),dueue接口是queue的子接口。
(2)priorityqueue
priorityqueue保存隊列元素的的順序并不是按照加入隊列的順序,而是按照隊列元素大小進行重新排序。所以當調用peek和poll方法來取隊列中的元素的時候,并不是先取出來隊列中最小的元素。從這個意義上來看,priorityqueue已經違反了隊列的基本規則。priorityqueue不允許插入null元素。
總結:
線程安全的有vector stack hashtable
不允許插入空元素的有hashtable priorityqueue enumset
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/snow_7/article/details/51791112