1. 程式人生 > >Java程式設計思想第四版第十一章學習——持有物件

Java程式設計思想第四版第十一章學習——持有物件

1、基本概念

Java容器類類庫的作用是“儲存物件”,分為
1)Collection.一個獨立元素的序列,這些元素都服從一條或多條規則。List必須按照插入的順序儲存元素,而Set不能有重複元素。Queue按照排隊規則來確定物件產生的順序(通常與他們被插入的順序相同)。
2)Map.一組成對的“鍵值對”物件。

2、List

List 將元素維護在特定的序列中,有兩種型別
(1)基本的ArrayList,它長於隨機訪問元素,但是在List中間插入和移除元素時較慢。
(2)LinkedList,在List中間進行插入和刪除操作代價較低,但是在隨機訪問方面相對較慢,但是它的特性集較ArrayList更大。

在List中,一些函式的用法:
(1)contains()方法來確定某個物件是否在物件中。
(2)remove()方法用來移除某個物件。
(3)如果你有一個物件的引用,可以使用indexOf()來確定該物件在List中所處的位置的索引編號。
(4)subList()方法用來從較大的列表中創建出一個片段。
(5)retainAll()方法用來求交集。
(6)removeAll()方法用來移除在引數List中的所有元素。
(7)addAll()方法用來在初始List的中間插入新的列表。

迭代器
迭代器是一個物件,它的工作是遍歷並選擇序列中的物件。從而做到了只是使用容器而不關心容器的型別。
在我看來,Java中的Iterator類似於資料結構中的單向連結串列,只能單向移動。只能用來:
(1)使用方法iterator()要求容器返回一個Iterator。Iterator將準備好返回序列的第一個元素。
(2)使用next()獲得序列中的下一個元素。
(3)使用hasNext()檢查序列中是否還有元素。
(4)使用remove()將迭代器新近返回的元素刪除。
這裡寫圖片描述

ListIterator

ListIterator是一個更強大的Iterator的子型別。只能用於各種List類的訪問,但是可以雙向移動。
(1)nextIndex()用來指向當前位置的後一個元素的指引。
(2)previousIndex()用來指向當前位置的前一個元素的指引。
(3)listIterator()方法產生一個指向List開始處的ListIterator。
(4)listIterator(n)方法建立一個一開始就指向列表索引為n的元素處的ListIterator。

LinkedList
LinkedList中添加了可以用作棧、佇列或雙端佇列的方法。
(1)getFirst()和element()返回列表的頭(第一個元素),如果為空,提示NoSuchElementException。peek()方法類似,不過在列表為空時返回null。
(2)addFirst()將某個元素插入到列表的頭部。而offer()、add()和addLast()作用類似,將某個元素插入到列表的尾部。
(3)remove()、removeFirst()和poll()都是將某個元素從列表的頭部移除。

Stack
LinkedList具有能夠直接實現棧的所有功能的方法。如下所示。

public class Stack<T>{
    private LinkedList<T> storage = new LinkedList<T>();
    public void push(T v) {storage.addFirst(v);}
    public T peek() {return storage.getFirst();}
    public T pop() {return storage.removeFirst();}
    public boolean empty() {return storage.isEmpty();}
    public String toString() {return storage.toString();}  
}

類名之後的告訴編譯器這將是一個引數化型別,而其中的型別引數,即在類被使用時將會被實際型別替換的引數,就是T。

3、Set

TreeSet將元素儲存在紅-黑樹資料結構中,而HashSet使用的是雜湊函式,LinkedHashList因為查詢速度的原因也使用了雜湊,但是看起來它使用了連結串列來維護元素的插入順序。

如果想按照字母序排序,可以向TreeSet的構造器傳入String.CASE_INSENSITIVE_ORDER比較器(比較器就是建立排序順序的物件)

Set<String> words = new TreeSet<String>       (String.CASE_INSENSITIVE_ORDER); 

4、Map

containsKey()和constainsValue()方法分別測試是否包含某個鍵或某個值。
keySet()方法產生一個由在某個Map中的所有鍵組成的Set。

5、Queue

LinkedList提供了方法以支援佇列的行為,並且實現了Queue介面。

public class QueueDemo{
    public static void printQ(Queue queue) {
    while(queue.peek() != null)
     System.out.print(queue.remove() + " ");
    System.out.println();
    }
    public static void main (String[] args){
        Queue<Integer>  queue = new LinkedList<Integer>();
        Random rand = new Random(47);
        for(int i = 0; i < 10; i++)
            queue.offer(rand.nextInt(i + 10));
        printQ(queue);
        Queue<Character> qc = new LinkedList<Charactor>();
        for(char c: "Brontosaurus".toCharArray())
             qc.offer(c);
        printQ(qc);
    }
}/*Output
8 1 1 1 5 14 3 1 0 1
B r o n t o s a u r u s 
*///

offer()方法在允許的情況下,將一個元素插入到隊尾,或者返回false。
peek()和element()都將在不移除的情況下返回對頭,但是peek()方法在佇列為空時返回null,而element()會丟擲NoSuchElementException異常。
poll()和remove()方法將移除並返回隊頭,但是poll()在佇列為空時返回null,而remove()會丟擲NoSuchElementException異常。