1. 程式人生 > >JAVA容器的那些事—集合

JAVA容器的那些事—集合

對象產生 () 圖片 捕獲 equals 分用 刪除元素 調用 get()

1.首先我們先講下Collection接口

Collection接口:

Collection是最基本的集合接口,它是由一個獨立元素所組成的序列,這些元素服務一條或多條規則。一個Collection代表一組Object,即Collection的元素(Elements)。

有些Collection允許有相同的元素,另一些則不允許,有些可以進行排序,另一些則也不允許,Java SDK不提供直接繼承Collection的接口,而是繼承Collection的一些子接口,“如List,Set”接口。

Collection的一些方法:

技術分享圖片

2.然後再說下List接口,Set接口和Map接口,當然順便提一下Queue隊列

List接口:

List是有序的Collection,按照插入的順序保存元素,使接口能夠精確的控制每個元素插入的位置,用戶能夠根據索引來訪問List中的元素。

實現List接口的常用類有:LinkedList,ArrayList,Vector和Stack。

Set接口:

核心點,Set是不包含重復元素的Collection(例:e1和e2都有e1.equals(e2)=false),允許有Null元素,但最多只能有一個Null元素。

Set容器類主要有HashSet和TreeSet等。

      

Map接口:

Map和List,Set接口有所不同,沒有繼承Collection。它是一組成對的“鍵值對”對象,允許通過鍵來查找值。

Map提供key到value的映射,一個Map中不能包含有相同的key,一個key只能映射一個value(一對一的關系)。

實現Map接口的常用類有:HashTable,HashMap,WeekHashMap。

       

主要方法:
1.boolean equals(Object o)比較對象
2.boolean remove(Object o)刪除一個對象
3.put(Object key,Object value)添加key和value
4.Hashtable類

 

Queue接口:

Queue(又稱"隊列")它是一種特殊的線性表,按照排隊規則來確定對象產生的順序。

簡單來說就是按照"先進先出"規則,表的前端部分用作刪除操作,後端部分用作插入操作,前端刪除部分稱做:“對頭”;後端插入部分稱做:“隊尾”。如果隊列為空的話,又被稱做:“空隊列”。  

值得一提的是LinkedList也實現了Queue接口,所以也可以把LinkedList當做Queue來用。

3.一起探索下實現List接口的常用類:LinkedList,ArrayList,Vector和Stack

LinkedList類:

LinkedList實現了List接口,允許Null元素,並且是線程不安全的(非線程安全),且無法隨機訪問,原因就是它的底層是通過鏈表實現的,若要從鏈表中刪除或插入某一個對象,只需要改變前後對象的引用,所以在速度方面的話相對ArrayList要快一些。

此外LinkedList還提供了一些額外的方法:get(),remove(),insert()用作LinkedList的首部和尾部,這些方法主要可以用作堆棧(stack),隊列(queue),雙向隊列(deque)。

註意:LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List:List list = Collections.synchronizedList(new LinkedList(…));

ArrayList類:

ArrayList實現的是可變大小的數組,它允許所有元素,包括Null元素,並且也是線程不安全的(非線程安全),但是允許隨機訪問,原因就是它是數列結構(數組),此結構本身就適合隨機訪問。

[]數組,Vector,ArrayList的結構在隨機訪問,遍歷和獲得大小方面都是O(1)的性能。

註意:和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。一般情況下使用這兩個就可以了。因為非同步,所以效率比較高,如果涉及到堆棧,隊列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。



Vector類:

和ArrayList非常的類似,不同處就是,它是線程安全的,由Vector創建的Iterator(叠代器),本身和ArrayList創建的Iterator(叠代器)是同一個接口,但因為Vector是線程安全的,所以當一個Iterator(叠代器)被創建而且在被使用時,另一個線程會改變Vector的狀態(例如:“添加”或“刪除”一些元素),這時候調用Iterator(叠代器)的方法時會拋出異常:" ConcurrentModificationException",因此這個異常必須被捕獲。

Stack類:

繼承了Vector,實現“後進先出”的堆棧,Stack提供了5個方法讓Vector當做堆棧被使用,基本的push()和pop()方法,還有peek方法取得棧頂的元素,empty方法判斷堆棧是否為空,search方法檢測一個元素在堆棧中的位置。

註:Stack剛創建後是“空棧

JAVA容器的那些事—集合