標籤:
1、類的基本結構
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
|-HashSet
|-TreeSet
Map
├Hashtable
├HashMap
└WeakHashMap
2、基本概念
0)Collection : 頂層介面,它都支援一個iterator()的方法,該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。public interface Collection<E> extends Iterable<E>
1)Set(集合):集合中的對象不按特定方式排序,並且沒有重複對象。它的有些實作類別(TreeSet)能對集合中的對象按特定方式排序。
2)List(列表):集合中的對象按索引位置排序,可以有重複對象,允許按照對象在集合中的索引位置檢索對象。
3)Map(映射):集合中的每一個元素包含一對鍵對象和值對象,集合中沒有重複的鍵對象,值對象可以重複。
3、實作類別的重要區別
1)ArrayList 和Vector是採用數組方式儲存資料,此數組元素數大於實際儲存的資料以便增加和插入元素,都允許直接序號索引元素,但是插入資料要設計到數組元素移動等記憶體操作,所以索引資料快插入資料慢;這就是線性表的順序表的優點和缺點,即查詢快,刪除、插入較慢。
2)Vector由於使用了synchronized方法(安全執行緒)所以效能上比ArrayList要差,但是在一些安全方法裡面他是很有用的。想要把一個List作為同步的線性表時,可以這樣使用:Collections.synchronizedList(list);
3)LinkedList使用雙向鏈表實現儲存,按序號索引資料需要進行向前或向後遍曆,但是插入資料時只需要記錄本項的前後項即可,所以插入數度較快!這就是線性表的鏈表的優點和缺點,即查詢慢,但是刪除插入快。可以用它作為隊列。
4)Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用。基本的push和pop方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否為空白,search方法檢測一個元素在堆棧中的位置。Stack剛建立後是空棧。
5)Queue 是一個Collection的子介面,Deque 是1.6 新增的介面繼承了Queue介面,他的子類主要就是完成隊列的棧的功能,相比之前的採用Stack或List(LinkedList實現了Deque)作為隊列與棧效果都要好,而且,Deque 是可以同時作為隊列和堆棧,他與List的一個很大區別是他沒有Index索引尋找元素。所以,如果需要使用隊列或堆棧時可以考慮Deque的子類:ArrayDeque
6)Set的實現其實和Map有著重大關係,看原始碼你就會發現,Set就是Map的key部分,Map的value則是一個常量替代。
4、其他注意事項
注意,開始學習的時候大家都認為,集合給我們最大的好處就是什麼對象都可以存入,如果是數組的話只能存入特定類型的對象,其實這個特點是集合的缺點,這也就是為什麼有泛型的出現,對於數組來說,集合的最大有點是集合可以邊長儲存元素!!如果是一個Object類型的數組不也一樣可以儲存任何資料類型的對象嗎?但是這樣又有什麼用呢?類型轉換是一個危險操作。
5、集合遍曆與刪除
private void print(Collection<String> list ){ Iterator<String> iter = list.iterator(); while(iter.hasNext()){ String str = iter.next(); if(str.equals("key")){ iter.remove(); } } }
不能採用其他方式的for迴圈刪除元素,否則會發生異常:java.util.ConcurrentModificationException
Java 複習 —— 集合