Java集合架構總結(4)——List介面的使用

來源:互聯網
上載者:User

標籤:while   分配   queue   應用   示範   jdk   java集合架構   nbsp   boolean   

Java集合架構總結(4)——List介面的使用

    List集合代表一個有序集合,集合中每個元素都有其對應的順序索引。List集合允許使用重複元素,可以通過索引來訪問指定位置的集合元素。

1、List介面和ListIterator介面

    List作為Collection介面的子介面,可以使用Collection介面裡的全部方法。List是有序集合,所以List集合裡增加了一些根據索引來操作集合元素的方法:

  • void add(int index, Object element):將元素element插入在List集合的index處。
  • boolean addAll(int index, Collection c):將集合c所包含的所有元素都插入在List集合的index處。
  • Object get(int index):返回集合index索引處的元素。
  • int lastIndexOf(Object o):返回對象o在List集合中最後一次出現的位置索引。
  • Object remove(int index):刪除並返回index索引處的元素。
  • Object set(int index, Object element):將index索引處的元素替換成element對象,返回新元素。
  • List subList(int fromIndex, int toIndex):返回從索引fromIndex(包含)到索引toIndex(不包含)處所有集合元素組成的子集合。

    List集合可以根據索引來插入、替換和刪除集合元素。

樣本程式:

public class TestList{    public static void main(String[] args)    {        List books = new ArrayList();        //向books集合中添加三個元素        books.add(new String("輕量級J2EE公司專屬應用程式實戰"));        books.add(new String("Struts2權威指南"));        books.add(new String("基於J2EE的Ajax寶典"));        System.out.println(books);        //將新字串對象插入在第二個位置        books.add(1 , new String("ROR敏捷開發最佳實務")); //已添加的對象,和下面語句做對比        for (int i = 0 ; i < books.size() ; i++ )        {            System.out.println(books.get(i));        }        //刪除第三個元素        books.remove(2);        System.out.println(books);        //判斷指定元素在List集合中位置:輸出1,表明位於第二位        System.out.println(books.indexOf(new String("ROR敏捷開發最佳實務"))); //新建立的對象        //將第二個元素替換成新的字串對象        books.set(1, new String("Struts2權威指南"));        System.out.println(books);        //將books集合的第二個元素(包括)到第三個元素(不包括)截取稱子集合        System.out.println(books.subList(1 , 2));    }}

程式運行結果:

[輕量級J2EE公司專屬應用程式實戰, Struts2權威指南, 基於J2EE的Ajax寶典] 
輕量級J2EE公司專屬應用程式實戰 
ROR敏捷開發最佳實務 
Struts2權威指南 
基於J2EE的Ajax寶典 
[輕量級J2EE公司專屬應用程式實戰, ROR敏捷開發最佳實務, 基於J2EE的Ajax寶典] 

[輕量級J2EE公司專屬應用程式實戰, Struts2權威指南, 基於J2EE的Ajax寶典] 
[Struts2權威指南]

程式說明:List集合可以使用普通for迴圈來遍曆集合元素。List判斷兩個對象相等只要通過equals方法比較返回true即可。如在判斷“ROR敏捷開發最佳實務”字串的位置是,新建立了一個新字串對象,但是程式仍返回第一次建立字串對象的位置。當調用List的set(int index, Object element)方法來改變List集合指定索引處元素時,指定的索引必須是List集合的有效索引。

     與set只提供了一個iterator()方法不同,List還額外提供了一個listIteratro()方法,該方法返回一個ListIterator對象,ListIterator介面繼承了Iterator介面,提供了專門操作List的方法。

ListIterator介面在Iterator介面基礎上增加了如下方法:

  • boolean hasPrevious():返回該迭代器關聯集合是否還有上一個元素。
  • Object previous():返回該迭代器上一個元素。
  • void add():在指定位置插入一個元素。

程式樣本:

public static void main(String[] args)    {        String[] books = {            "Struts2權威指南",            "輕量級J2EE公司專屬應用程式實戰"        };        List bookList = new ArrayList();        for (int i = 0; i < books.length ; i++ )        {            bookList.add(books[i]);        }        ListIterator lit = bookList.listIterator();        while (lit.hasNext())        {            System.out.println(lit.next());            lit.add("-------分隔字元-------");        }        System.out.println("==========下面開始反向迭代===========");        while(lit.hasPrevious())        {            System.out.println(lit.previous());        }    }}

程式運行結果:

Struts2權威指南 
輕量級J2EE公司專屬應用程式實戰 
==========下面開始反向迭代=========== 
-------分隔字元------- 
輕量級J2EE公司專屬應用程式實戰 
-------分隔字元------- 
Struts2權威指南

程式說明:List通過ListTterator迭代集合時,即可採用next()方法進行正向迭代,迭代過程中可以使用add()方法向上一次迭代元素的後面添加一個新元素。同時程式示範了向前迭代。

 2、ArrayList和Vector實作類別

    ArrayList和Vector作為List類的兩個典型實現,完全支援前面介紹的List介面全部功能。

    ArrayList和Vector類都是基於數組實現的List類,他們封裝了一個動態再分配的Object[]數組。每個ArrayList或Vector對象有一個capacity屬性,表示它們所封裝的Object[]數組的長度。capacity會添加元素的個數而自動增加。當向集合中添加大量元素時,可以使用ensureCapacity方法一次性地增加capacity。這可以減少增加重分配次數,從而提供效能。capacity大小也可以在建立時就指定,該屬性預設為10.

ArrayList和Vector提供如下兩個方法來操作capacity屬性:

  • void ensureCapacity(int minCapacity):將ArrayList或Vector集合的capacity增加minCapacity。
  • void trimToSize():調整ArrayList或Vector集合的capacity為列表當前大小。程式可調用該方法來減少ArrayList或Vector集合Object Storage Service空間。

    ArrayList和Vector用法幾乎相同,Vector是一個古老的集合(從JDK1.0),起初Java還沒有提供系統的集合架構,所以Vector裡提供了一些方法名很長的方法:例如addElement(Object obj), 等同於add()方法。從JDK1.2以後,Java提供了系統的集合架構,就將Vector改為實習List介面,作為List的實習之一,從而導致Vector裡有一些功能重複的方法。Vector具有很多缺點,通常盡量少用Vector實作類別。

 

   ArrayList和Vector的區別:ArrayList是線程不安全的,多個線程訪問同一個ArrayList集合時,如果有超過一條線程修改了ArrayList集合,則程式必須手動保證該集合的同步性。Vector集合則是安全執行緒的,無線程式保證該集合的同步性。因為Vector是安全執行緒的,所以Vector的效能比ArrayList的效能要低。實際上,即使保證List集合安全執行緒,同樣不推薦使用Vector實作類別。Collections工具類,可以將一個ArrayList變成安全執行緒的。

 

   Vector還提供了一個Stack子類,它用於類比了”棧“這種資料結構,”棧“通常是指”後進先出“(LIFO)的容器。最後”push“進棧的元素,將最先被”pop“出棧。與Java中其他集合一樣,進棧出棧的都是Object,因此從棧中取出元素後必須做類型轉換,除非你只是使用Object具有的操作。所以stack類提供了如下幾個方法:

  • Object peek():返回”棧“的第一個元素,但並不將該元素”pop“出棧。
  • Object pop():返回”棧“的第一個元素,並將該元素”pop“出棧。
  • void push(Object item):將一個元素”push“進棧,最後一個進”棧“的元素總是位於”棧“頂。

程式樣本:

public class TestVector{    public static void main(String[] args)    {        Stack v = new Stack();        //依次將三個元素push入"棧"        v.push("Struts2權威指南");        v.push("輕量級J2EE公司專屬應用程式實戰");        v.push("ROR敏捷開發最佳實務");        //輸出:[Struts2權威指南, 輕量級J2EE公司專屬應用程式實戰, ROR敏捷開發最佳實務]        System.out.println(v);        //訪問第一個元素,但並不將其pop出"棧",輸出:ROR敏捷開發最佳實務        System.out.println(v.peek());        //依然輸出:[Struts2權威指南, 輕量級J2EE公司專屬應用程式實戰, ROR敏捷開發最佳實務]        System.out.println(v);        //pop出第一個元素,輸出:ROR敏捷開發最佳實務        System.out.println(v.pop());        //依然輸出:[Struts2權威指南, 輕量級J2EE公司專屬應用程式實戰]        System.out.println(v);    }}

程式運行結果:

[Struts2權威指南, 輕量級J2EE公司專屬應用程式實戰, ROR敏捷開發最佳實務] 
ROR敏捷開發最佳實務 
[Struts2權威指南, 輕量級J2EE公司專屬應用程式實戰, ROR敏捷開發最佳實務] 
ROR敏捷開發最佳實務 
[Struts2權威指南, 輕量級J2EE公司專屬應用程式實戰]

   3、LinkedList實作類別

    List還有一個LinkedList的實現,它是一個基於鏈表實現的List類,對於順序訪問集合中的元素進行了最佳化,特別是當插入、刪除元素時速度非常快。因為LinkedList即實現了List介面,也實現了Deque介面(雙向隊列),Deque介面是Queue介面的子介面,它代表一個雙向列表,Deque介面裡定義了一些可以雙向操作隊列的方法:

  • void addFirst(Object e):將制定元素插入該雙向隊列的開頭。
  • void addLast(Object e):將制定元素插入該雙向隊列的末尾。
  • Iterator descendingIterator():返回以該雙向隊列對應的迭代器,該迭代器將以逆向順序來迭代隊列中的元素。
  • Object getFirst():擷取、但不刪除雙向隊列的第一個元素。
  • Object getLast(): 擷取、但不刪除雙向隊列的最後一個元素。
  • boolean offerFirst(Object e): 將指定的元素插入該雙向隊列的開頭。
  • boolean offerLast(Object e): 將指定的元素插入該雙向隊列的末尾。
  • Object peekFirst(): 擷取、但不刪除該雙向隊列的第一個元素:如果此雙端隊列為空白,則返回null。
  • Object peekLast():擷取、但不刪除該雙向隊列的最後一個元素:如果此雙端隊列為空白,則返回null。
  • Object pollFirst():擷取、並刪除該雙向隊列的第一個元素:如果此雙端隊列為空白,則返回null。
  • Object pollLast():擷取、並刪除該雙向隊列的最後一個元素:如果此雙端隊列為空白,則返回null。
  • Object pop():pop出該雙向隊列所表示的棧中第一個元素。
  • void push(Object e):將一個元素push進該雙向隊列所表示的棧中(即該雙向隊列的頭部)。
  • Object removerFirst():擷取、並刪除該雙向隊列的最後一個元素。
  • Object removeFirstOccurrence(Object o):刪除該雙向隊列的第一次的出現元素o。
  • Object removeLast():擷取、並刪除該雙向隊列的最後一個元素。
  • Object removeLastOccurrence(Object o):刪除該雙向隊列的最後一次出現的元素o。

從上面方法中可以看出,LinkedList不僅可以當成雙向隊列使用,也可以當成“棧”使用。同時,LinkedList實現了List介面,所以還被當成List使用。

程式樣本:

public class TestLinkedList{    public static void main(String[] args)    {        LinkedList books = new LinkedList();        //將字串元素排入佇列的尾部        books.offer("Struts2權威指南");        //將一個字串元素入棧        books.push("輕量級J2EE公司專屬應用程式實戰");        //將字串元素添加到隊列的頭部        books.offerFirst("ROR敏捷開發最佳實務");        for (int i = 0; i < books.size() ; i++ )        {            System.out.println(books.get(i));        }        //訪問、並不刪除隊列的第一個元素        System.out.println(books.peekFirst());        //訪問、並不刪除隊列的最後一個元素        System.out.println(books.peekLast());        //採用出棧的方式將第一個元素pop出隊列        System.out.println(books.pop());        //下面輸出將看到隊列中第一個元素被刪除        System.out.println(books);        //訪問、並刪除隊列的最後一個元素        System.out.println(books.pollLast());        //下面輸出將看到隊列中只剩下中間一個元素:輕量級J2EE公司專屬應用程式實戰        System.out.println(books);    }}

程式運行結果:

ROR敏捷開發最佳實務 
輕量級J2EE公司專屬應用程式實戰 
Struts2權威指南 
ROR敏捷開發最佳實務 
Struts2權威指南 
ROR敏捷開發最佳實務 
[輕量級J2EE公司專屬應用程式實戰, Struts2權威指南] 
Struts2權威指南 
[輕量級J2EE公司專屬應用程式實戰]

說明:程式中示範了LinkedList作為雙向隊列、棧和List集合的用法。LinkedList與ArrayList、Vector的實現機制完全不同,ArrayList、Vector內部以數組的形式來儲存集合中的元素,因此隨機訪問集合元素上有較好的效能;而LinkedList內部以鏈表的形式來儲存集合中的元素,因此隨機訪問集合時效能較差,但在插入、刪除元素時效能非常出色(只需改變指標所指的地址即可)。Vector因實現了線程同步功能,所以各方面效能有所下降。

 

關於使用List集合的幾點建議:

  • 如果需要遍曆List集合元素,對應ArrayList、Vector集合,則應該使用隨機存取方法(get)來遍曆集合元素,這樣效能更好。對應LinkedList集合,則應採用迭代器(Iterator)來遍曆集合元素。
  • 如果需要經常執行插入、刪除操作來改變Lst集合大小,則應該使用LinkedList集合,而不是ArrayList。
  • 如果多條線程需要同時訪問List集合中的元素,可以考慮使用Vector這個同步實現。

Java集合架構總結(4)——List介面的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.