1. 程式人生 > >java集合類應用

java集合類應用

Java Collections Framework是Java提供的對集合進行定義,操作,和管理的包含一組介面,類的體系結構。
Collection介面
Collection是最基本的集合介面,一個Collection代表一組Object的集合,這些Object被稱作Collection的元素。
所有實現Collection介面的類都必須提供兩個標準的建構函式:無引數的建構函式用於建立一個空的Collection,有一個Collection引數的建構函式用於建立一個新的Collection,這 個新的Collection與傳入的Collection有相同的元素。後一個建構函式允許使用者複製一個Collection。
如何遍歷Collection中的每一個元素?不論Collection的實際型別如何,它都支援一個iterator()的方法,該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。典型的用法如下:

             Iterator it = collection.iterator(); // 獲得一個迭代子 
             while(it.hasNext()) {                    //hasNext判斷是是否有下一個元素
                        Object obj = it.next(); // 得到下一個元素 
                        }

根據用途的不同,Collection又劃分為List與Set。
1.List介面
List繼承自Collection介面。List是有序的Collection,使用此介面能夠精確的控制每個元素插入的位置。使用者能夠使用索引(元素在List中的位置,類似於陣列下標)來訪問List中的元素,這類似於Java的陣列。
跟Set集合不同的是,List允許有重複元素。對於滿足e1.equals(e2)條件的e1與e2物件元素,可以同時存在於List集合中。當然,也有List的實現類不允許重複元素的存在。
除了具有Collection介面必備的iterator()方法外,List還提供一個listIterator()方法,返回一個 ListIterator介面,和標準的Iterator介面相比,ListIterator多了一些add()之類的方法,允許新增,刪除,設定元素, 還能向前或向後遍歷。
實現List介面的常用類有LinkedList,ArrayList,Vector和Stack。

2.LinkedList類
LinkedList實現了List介面,允許null元素。此外LinkedList提供額外的get,remove,insert方法在 LinkedList的首部或尾部。如果多個執行緒同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在建立List時構造一個同步的List:List list = Collections.synchronizedList(new LinkedList(…));
LinkedList類使用泛型並用強制for迴圈遍歷,如下:

        LinkedList<String> linkedList = new LinkedList();
        linkedList.add("漢語");
        linkedList.add("英語");
        for(Iterator<String> iterator = linkedList.iterator();iterator.hasNext();){
                               System.out.println(iterator.next());
        }

3.ArrayList類
ArrayList實現了可變大小的陣列。它允許所有元素,包括null。ArrayList沒有同步。
size,isEmpty,get,set方法執行時間為常數。但是add方法開銷為分攤的常數,新增n個元素需要O(n)的時間。其他的方法執行時間為線性。
每個ArrayList例項都有一個容量(Capacity),即用於儲存元素的陣列的大小。這個容量可隨著不斷新增新元素而自動增加,但是增長演算法並 沒有定義。當需要插入大量元素時,在插入前可以呼叫ensureCapacity方法來增加ArrayList的容量以提高插入效率。
和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。
ArrayList類使用泛型並遍歷,如下:

        ArrayList<String> strings = new ArrayList<>();
        strings.add("漢語");
        strings.add("英語");
        int size = strings.size();
        for (int i = 0; i <size ; i++) {
                      System.out.println(strings.get(i));
        }

4.Vector類
由Vector建立的Iterator,雖然和ArrayList建立的 Iterator是同一介面,但是,因為Vector是同步的,當一個Iterator被建立而且正在被使用,另一個執行緒改變了Vector的狀態(例如,新增或刪除了一些元素),這時呼叫Iterator的方法時將丟擲ConcurrentModificationException,因此必須捕獲該異常。
Vector類使用泛型並遍歷,如下:

        Vector<String> strings = new Vector();
        strings.add("漢語");
        strings.add("英語");
        Enumeration<String> elements = strings.elements();
        while(elements.hasMoreElements()){
                    String s = elements.nextElement();
                    System.out.println(s);
        }

注意事項:
1、Collection沒有get()方法來取得某個元素。只能通過iterator()遍歷元素。
2、Set和Collection擁有一模一樣的介面。
3、List,可以通過get()方法來一次取出一個元素。使用數字來選擇一堆物件中的一個,get(0)…。(add/get)
4、一般使用ArrayList。用LinkedList構造堆疊stack、佇列queue。