淺談JAVA集合框架(引的)

廳一一發表於2009-07-21
 

Java提供了數種持有物件的方式,包括語言內建的Array,還有就是utilities中提供的容器類(container classes),又稱群集類(collection classes)。集合在java中非常重要,在討論之前,先來看幾個面試中的經典問題。 
1 Collection
Collections的區別。 
2 List, Set, Map
是否繼承自Collection介面。 
3 ArrayList
Vector的區別。 
4 HashMap
Hashtable的區別。 

篇尾有答案,我們開始正題。   

集合Collection介面  

–Collection 是任何物件組,元素各自獨立,通常擁有相同的套用規則。Set List由它派生。

基本操作  增加元素add(Object obj); addAll(Collection c);  

刪除元素 remove(Object obj); removeAll(Collection c); 

求交集 retainAll(Collection c);  

刪除元素 remove(Object obj); removeAll(Collection c); 

求交集 retainAll(Collection c);  

訪問/遍歷集合元素的好辦法是使用Iterator介面(迭代器用於取代Enumeration)

Public interface Iterator

    Public Boolean hasNext(}; 

    Public Object next(}; 

    Public void remove(}; 

}  

set 
沒有重複專案的集合  

有三種特定型別的集可用 

HashSet-基於雜湊表的集,加進雜湊表的元素要實現hashCode()方法  

LinkedHashSet-對集迭代時,按增加順序返回元素 

TreeSet-基於(平衡)樹的資料結構    

清單List 

位置性集合。加進清單的元素可以加在清單中特定位置或加到末尾  

有兩個特定版本

ArrayList(陣列表)-類似於Vector,都用於縮放陣列維護集合。區別:

.同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的 
.資料增長:當需要增長時,Vector預設增長為原來一培,而ArrayList卻是原來的一半 

LinkedList(連結串列)-是雙向連結串列,每個節點都有兩個指標指向上一節點和下一節點。 

用在FIFO,用addList()加入元素 removeFirst()刪除元素
用在FILO,addFirst()/removeLast()  

ListIterator提供雙向遍歷next() previous(),可刪除、替換、增加元素  

對映表Map  

用於關鍵字/數值對,像個Dictionary  

處理Map的三種集合  

關鍵字集KeySet()  

數值集value() 

專案集enrySet()  

四個具體版本

HashMap-雜湊表的通用對映表 

LinkedHashMap-擴充套件HashMap,對返回集合迭代時,維護插入順序  

WeakHashMap-基於弱引用雜湊表的對映表,如果不保持對映表外的關鍵字的引用,則記憶體回收程式會回收它 

TreeMap-基於平衡樹的對映表   

HashMap-雜湊表的通用對映表  

LinkedHashMap-擴充套件HashMap,對返回集合迭代時,維護插入順序  

WeakHashMap-基於弱引用雜湊表的對映表,如果不保持對映表外的關鍵字的引用,則記憶體回收程式會回收它 

TreeMap-基於平衡樹的對映表 
Collections
類,用於同步集合,還能改變集合只讀方式的類 
e.g.: 

Map mp=new HashMap();

mp=Collections.synchronizedMap(mp); //生成執行緒安全的對映表 

mp=Collections.unmodifiableMap(mp); 
//生成只讀對映表 

Comparable 自然順序的排序類 Comparator 面向樹的集合排序類  

容器分類學(Container taxonomy)  

集合介面: Collection List Set;Map Iterator ListIterator 

抽象類: AbstractCollection AbstractList AbstractSet AbstractMap AbstractSequentiaList

老版本中的集合型別 

Vector  

Vector,就是向量。一種異構的混合體,可以動態增加容量。對它的操作簡要如下 

比如我們有一個Vector: Vector myVec=new Vector(a_Array.length)  

取得vector的長度:myVec.size(); 

賦值:set(int position,Object obj) / setElementAt(Object obj, int position) –不支援動態增長  

      add(Object obj )/ addElement(Object obj) Vector末尾加入物件  

e.g.myVec.add(new a_Array[0]); 

取出元素:get(int position) / getElement(int position)

Stack 

Vector的子類。就是資料結構裡講濫了的堆疊(這個詞可簡稱棧,不要混淆於heap-堆)。後進先出的存取方式。  

Stack()構造空棧 

Empty()叛空  

Search()檢查堆疊是否有元素 

Peek()取得棧頂元素 

Pop()彈棧 

Push()入棧   

Enumeration介面   

Dictionary  

字典。關鍵字/數值方式存取資料,如果對映沒有此關鍵字,取回null 

Hashtable 

Dictionary結構的具體實現。   

面試題答案  

Collection Collections的區別。  

Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。  

Collection是個java.util下的介面,它是各種集合結構的父介面

List, Set, Map是否繼承自Collection介面? ListSet Map不是  

ArrayListVector的區別。 
.同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的 
.資料增長:當需要增長時,Vector預設增長為原來一培,而ArrayList卻是原來的一半  

HashMapHashtable的區別  
.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMapJava 1.2引進的Map介面的一個實現 

.同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的 

.值:只有HashMap可以讓你將空值作為一個表的條目的keyvalue 

 謝謝作者。

部落格園大道至簡

http://www.cnblogs.com/jams742003/

轉載請註明:部落格園


相關文章