List集合表明一個有序集合,集合中每個元素都有其對應的順序索引。List集合允許使用重複元素,能夠經過索引來訪問指定位置的集合對象。java
ArrayList和Vector作爲List的類的兩個典型實現,徹底支持list集合的所有功能。程序員
ArrayList和Vector類都是基於數組實現的List類,因此ArrayList和Vector類封裝了一個動態再分配的Object[]數組。每一個ArrayList或Vector對象有一個capacity屬性,這個capacity表示它們所封裝的Object[]數組的長度。當向ArrayList或Vector中添加元素時,它們的capacity會自動增長。編程
對於一般編程場景,程序員無須關心ArrayList或Vector的capacity屬性。但若是向ArrayList集合或Vector集合中添加大量元素時,可以使用ensureCapacity方法一次性地增長capacity。這能夠減小增長重分配的次數,從而提升性能。數組
若是開始就知道ArrayList或Vector須要保存多少個元素,則能夠在建立該它們時就指定它們的capacity大小。若是建立空的ArrayList和Vector時不指定capacity屬性,該屬性默認爲10。安全
除此以外,ArrayList和Vector還提供了以下兩個方法來操做capacity屬性:數據結構
void ensureCapacity(int minCapacity); 將ArrayList或Vector集合的capacity增長minCapacity。框架
void trimToSize(); 調整ArrayList或Vector集合的capacity爲列表當前大小。程序可調用該方法來減小ArrayList或Vector集合對象存儲空間。工具
ArrayList和Vector在用法上幾乎徹底相同,但因爲Vector是一個古老的集合(從JDK1.0就有了),最開始的時候,Java沒有提供系統的集合框架,因此Vector裏面提供一些方法名很長的方法:例如addElement(Object obj);實際上這個方法與add(Object obj)沒有任何區別。從JDK1.2以後,Java提供了系統的集合框架,就將Vector改成實現List接口,作爲List的實現之一,從而致使Vector裏面有一些功能重複的方法。性能
除此以外,ArrayList和Vector的顯著區別是;ArrayList是線程不安全的,當多條線程訪問同一個ArrayList集合時,若是有超過一條線程修改了ArrayList集合,則程序必須受到保證該集合的同步性。但Vector是線程安全的,無須程序保證該集合的同步性。由於Vector是線程安全的,因此Vector的性能要比ArrayList的效率要低。實際上即便須要保證list集合線程安全,一樣不推薦使用Vector實現類,而是使用Collections工具類,它能夠將一個ArrayList變的線程安全。spa
Vector還提供了一個Stack子類,它用於模擬了「棧」這種數據結構,「棧」一般是指「後進先出」的容器。最後「push」進棧的元素,將最早被「pop」出棧。與Java中其餘集合同樣,進棧出棧的都是Object。
Object peek(); //返回「棧」的第一個元素,但並不將該元素「pop」出棧。
Object pop(); //返回「棧」的第一個元素,並將該元素「pop」出棧。
void push(Object obj); //將一個元素「push」進棧,最後一個進「棧」的元素老是位於「棧」頂。
public class Test { public static void main(String[] args){ Stack<Integer> s = new Stack<Integer>(); s.push(6); s.push(5); s.push(4); //輸出:[6, 5, 4] System.out.println(s); //訪問第一個元素,但並不將其pop出棧,輸出:4 System.out.println(s.peek()); //pop出第一個元素,輸出:4 System.out.println(s.pop()); //輸出: [6, 5] System.out.println(s); } }
咱們知道有一個操做數組的工具類:Arrays,該工具類裏提供了asList(Object... a)方法,該方法能夠把一個數組或指定個數的對象轉換成一個List集合,這個List集合既不是ArrayList實現類的實例,也不是Vector實現類的實例,而是Arrays的內部類ArrayList的實例。
Arrays.ArrayList是一個固定長度的List集合,程序只能遍歷訪問該集合裏的元素,不可增長、刪除該集合裏的元素。以下:
public class Test { public static void main(String[] args){ String str[] = {"北京", "上海", "深圳"}; List<String> list = Arrays.asList(str); for(String s : list){ System.out.println(s); } //如下兩句都將引發錯誤java.lang.UnsupportedOperationException list.add("南京"); list.remove(0); } }
上面最後兩行代碼對於普通List集合徹底正常,但若是試圖經過這兩個方法來增長、刪除Arrays.ArrayList集合裏的元素,將會引起異常。因此上面代碼在編譯時徹底正常,但在運行時拋出java.lang.UnsupportedOperationException異常。