本文是從《java程式員面試寶典》摘抄出來的。
(1) java容器類一共有兩種主要類型: collection和map。
collection和map的區別在於每個“槽”所儲存的元素個數不同。collection類型中,每個“槽”只有一個元素;map中,持有key-value關聯,像一個小型資料庫。所有的java容器類都可以自動調整自己的尺寸。
(2) 各自旗下的子類別關係。
collection的子類如下:
--ArrayList:
--LinkedList:
- --Set: 每個值只能儲存1個對象,不能含有重複的元素。
--HashSet
--TreeSet
--LinkedHashSet
collection,list,set,map都是介面,不能執行個體化。繼承自它們的ArrayList,HashTable,stack是具體的class,這些才可以被執行個體化。
Vector容器確切的知道它所持有的對象的type,vector不進行邊界檢查。
(3) Collections類
這個類是針對集合類的一個協助類,它提供了一系列的靜態方法實現對各種集合類的搜尋,排序等操作。相當於對Array進行類似操作的類--Arrays。如:
Collections.max(Collection col);
Collection.sort(List list);
(4)一些特殊的集合類是安全執行緒的,請參考這篇文章
http://www.ibm.com/developerworks/library/j-jtp07233/index.html
(5) 如何選擇容器類
1,容器類和array的區別。
容器類僅能儲存物件引用,而不是將對象複製一份放入數列的某個位置。對於primitive data,如int等,放入容器類和取出時就會被自動裝箱,拆箱。
List,set,map將其中所有儲存的對象視為object,也就是說一旦對象進入容器類,就損失了對象的type資訊。例如:
public static void main(String arg[]){int[] x = {'A'};ArrayList a = new ArrayList();for(int i=0;i<x.length;i++){a.add(x[i]);}int j = (Integer) a.get(0); //這裡如果不進行類型轉換,則不能通過編譯。System.out.print(j); //這裡列印出來的是A的asc碼,65. }
或者使用泛型:
public static void main(String arg[]){int[] x = {'A'};ArrayList<Integer> a = new ArrayList<Integer>(); //注意這裡只能是Integer而不是int,再次說明容器類只能裝載對象,int這類非對象是不能直接裝入的。for(int i=0;i<x.length;i++){a.add(x[i]);}int j = a.get(0); //此時就不必進行類型轉換了。System.out.print(j); }
通過上例可以發現int[] x={'A'};並不會報錯,這是因為array天生就具有了類似泛型的功能:只要通過編譯,運行時就不會出錯。array會檢查放入其中的元素的類型,如果這句改為int[] x={“A”};則無法通過編譯。