Java集合框架(三)—— List、ArrayList、Vector、Stack

  • List接口

  List集合表明一個有序集合,集合中每個元素都有其對應的順序索引。List集合允許使用重複元素能夠經過索引來訪問指定位置的集合對象。java

  • ArrayList和Vector實現類

  ArrayListVector作爲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);
    }
}
  • 固定長度的List

  咱們知道有一個操做數組的工具類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異常。

相關文章
相關標籤/搜索