Java集合框架總結——List接口的使用1

     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集合對象存儲空間。

    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企業應用實戰]

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章