Java提供了數(shù)種持有對象的方式,包括語言內(nèi)置的Array,還有就是utilities中提供的容器類(container classes),又稱群集類(collection classes)。集合在java中非常重要,在討論之前,先來看幾個面試中的經(jīng)典問題。
1 Collection 和 Collections的區(qū)別。
2 List, Set, Map是否繼承自Collection接口。
3 ArrayList和Vector的區(qū)別。
4 HashMap和Hashtable的區(qū)別。
篇尾有答案,我們開始正題。

集合Collection接口
--Collection 是任何對象組,元素各自獨立,通常擁有相同的套用規(guī)則。Set、List由它派生。
基本操作:增加元素add(Object obj); addAll(Collection c);
刪除元素:remove(Object obj); removeAll(Collection c);
求交集:retainAll(Collection c);

訪問/遍歷集合元素的好辦法是使用Iterator接口(迭代器用于取代Enumeration)
Public interface Iterator{
Public Boolean hasNext(0;
Public Object next(0;
Public void remove(0;
}

集set
--沒有重復(fù)項目的集合
有三種特定類型的集可用
HashSet-基于散列表的集,加進(jìn)散列表的元素要實現(xiàn)hashCode()方法
LinkedHashSet-對集迭代時,按增加順序返回元素
TreeSet-基于(平衡)樹的數(shù)據(jù)結(jié)構(gòu)

清單List
--位置性集合。加進(jìn)清單的元素可以加在清單中特定位置或加到末尾
有兩個特定版本
ArrayList(數(shù)組表)-類似于Vector,都用于縮放數(shù)組維護(hù)集合。區(qū)別:
一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
二.數(shù)據(jù)增長:當(dāng)需要增長時,Vector默認(rèn)增長為原來一培,而ArrayList卻是原來的一半
LinkedList(鏈表)-是雙向鏈表,每個節(jié)點都有兩個指針指向上一節(jié)點和下一節(jié)點。
用在FIFO,用addList()加入元素 removeFirst()刪除元素
用在FILO,用addFirst()/removeLast()
ListIterator提供雙向遍歷next() previous(),可刪除、替換、增加元素

映射表Map
--用于關(guān)鍵字/數(shù)值對,像個Dictionary
處理Map的三種集合
關(guān)鍵字集KeySet()
數(shù)值集value()
項目集enrySet()
四個具體版本
HashMap-散列表的通用映射表
LinkedHashMap-擴展HashMap,對返回集合迭代時,維護(hù)插入順序
WeakHashMap-基于弱引用散列表的映射表,如果不保持映射表外的關(guān)鍵字的引用,則內(nèi)存回收程序會回收它
TreeMap-基于平衡樹的映射表

Collections類,用于同步集合,還能改變集合只讀方式的類
e.g.:
Map mp=new HashMap()
mp=Collections.synchronizedMap(mp); //生成線程安全的映射表
mp=Collections.unmodifiableMap(mp); //生成只讀映射表

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

容器分類學(xué)(Container taxonomy)
集合接口: Collection List Set;Map Iterator ListIterator。
抽象類: AbstractCollection AbstractList AbstractSet AbstractMap AbstractSequentiaList。

老版本中的集合類型
Vector類
Vector,就是向量。一種異構(gòu)的混合體,可以動態(tài)增加容量。對它的操作簡要如下
比如我們有一個Vector: Vector myVec=new Vector(a_Array.length)
取得vector的長度:myVec.size();
賦值:set(int position,Object obj) / setElementAt(Object obj, int position) –不支持動態(tài)增長
add(Object obj )/ addElement(Object obj) 在Vector末尾加入對象
e.g.:myVec.add(new a_Array[0]);
取出元素:get(int position) / getElement(int position)

Stack類
是Vector的子類。就是數(shù)據(jù)結(jié)構(gòu)里講濫了的堆棧(這個詞可簡稱棧,不要混淆于heap-堆)。后進(jìn)先出的存取方式。
Stack()構(gòu)造空棧
Empty()叛空
Search()檢查堆棧是否有元素
Peek()取得棧頂元素
Pop()彈棧
Push()入棧

Enumeration接口
Dictionary類
字典。關(guān)鍵字/數(shù)值方式存取數(shù)據(jù),如果映射沒有此關(guān)鍵字,取回null。

Hashtable類
是Dictionary結(jié)構(gòu)的具體實現(xiàn)。

面試題答案
1、Collection 和 Collections的區(qū)別。
Collections是個java.util下的類,它包含有各種有關(guān)集合操作的靜態(tài)方法。Collections是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序、線程安全化等操作
Collection是集合類的上級接口,即是java.util下的接口,它是各種集合結(jié)構(gòu)的父接口。繼承于它的接口主要有Set 和List。
2、List, Set, Map是否繼承自Collection接口? List,Set是,Map不是
3、ArrayList和Vector的區(qū)別。
一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
二.數(shù)據(jù)增長:當(dāng)需要增長時,Vector默認(rèn)增長為原來一培,而ArrayList卻是原來的一半
4、HashMap和Hashtable的區(qū)別
一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個實現(xiàn)
二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value


補充有關(guān)集合類的幾個面試題目如下:
1、Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別
答:Set里的元素是不能重復(fù)的,那么用iterator()方法來區(qū)分重復(fù)與否。equals()是判讀兩個Set是否相等
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當(dāng)兩個分離的對象的內(nèi)容和類型相配的話,返回真值