java編程思想讀書筆記 第十一章 持有對象(中)

1.容器的打印
你必須使用Arrays.toString()來產生數組的可打印表示,但是打印容器無需任何幫助。下面是一個例子,這個例子中也介紹了一些基本類型的容器:

public class PrintingContainers {
    static Collection fill(Collection<String> collection){

        collection.add("rat");
        collection.add("cat");
        collection.add("dog");
        collection.add("dog");
        return collection;
    }
    static Map fill(Map<String, String> map){
        map.put("rat", "Fuzzy");
        map.put("cat", "Rags");
        map.put("dog", "Bosco");
        map.put("dog", "Spot");
        return map;
    }
    public static void main(String[] args) {
        System.out.println(fill(new ArrayList<String>()));
        System.out.println(fill(new LinkedList<String>()));
        System.out.println(fill(new HashSet<String>()));
        System.out.println(fill(new TreeSet<String>()));
        System.out.println(fill(new LinkedHashSet<String>()));
        System.out.println(fill(new HashMap<String,String>()));
        System.out.println(fill(new TreeMap<String,String>()));
        System.out.println(fill(new LinkedHashMap<String,String>()));
    }
}
輸出:
[rat, cat, dog, dog]
[rat, cat, dog, dog]
[cat, dog, rat]
[cat, dog, rat]
[rat, cat, dog]
{cat=Rags, dog=Spot, rat=Fuzzy}
{cat=Rags, dog=Spot, rat=Fuzzy}
{rat=Fuzzy, cat=Rags, dog=Spot}

這裏展示了java容器類庫的兩種主要類型,它們的區別在於容器中每個“槽”保存的元素個數。Collection在每個槽中只能爆粗一個元素。此類容器包括:List,以特定的順序保存一組元素;Set,元素不能重複;Queue,只允許在容器的一“端”插入對象,並從另外一“端”移除對象。Map在每保持的值。
查看輸出發現,默認的打印星期即可生成可讀性很好的結果。Collection打印出來的內容用方括號括住,每個元素由逗號分隔。Map則用大括號括住,鍵和值由等號聯繫。第一個fill()方法可以作用於所有類型的Collection,這些類型都實現了用來添加新元素的add()方法。ArrayList和LinkedList都是List類型,從輸出可以看出,它們都按照被插入的順序來保存元素,兩者的不同之處在於執行某些類型的操作時的性能,而且Linked多於ArrayList。HashSet、TreeSet和LinkedHashSet都是Set類型,輸出顯示在Set中,每個相同的項只有保存一次,但是輸出也顯示了不同的Set實現存儲元素的方式也不同。HashSet使用的是相當複雜的方式來存儲元素的,存儲的順序不重要。如果存儲順序很重要,那麼可以使用TreeSet,它按照比較結果的升序保存對象;或者使用LinkedHashSet,它按照被添加的順序保存對象。Map使得你可以用鍵來查找對象,就像一個簡單的數據庫。鍵所關聯的對象稱爲值。對於每個鍵,Map只接受存儲一次。Map.put(key,value)方法將增加一個值,Map.get(key)方法將產生與這個鍵相關聯的值。注意,不必考慮Map尺寸,因爲它自己會自動地調整尺寸。Map還知道如何打印自己,它會顯示相關聯的鍵和值。鍵和值在Map中保存的順序並不是它們插入的順序,因爲HashMap實現使用的是一種非常快的算法(LRU算法,近期最少使用算法)來控制順序。

2.List
List承諾可以將元素維護在特定的系列中。List接口在Collection的基礎上添加了大量的方法,使得可以在List的中間插入和移除元素。有兩種類型的List:
基本的ArrayList,它長於隨機訪問元素,但是在List的中間插入和移除元素時較慢。
LinkedList,它通過代價較低的在List中間進行插入和刪除操作,提供了優化的順序訪問。LinkedList在隨機訪問方面相對較慢,但是它的特性集較ArrayList更大。
在List中,你可以用contains()方法來確定某個對象是否在列表中。如果你想移除一個對象,則可以將這個對象的引用傳遞給remove()方法。同樣,如果你有一個對象的引用,則可以使用indexOf()來發現該對象在List中所處的位置的索引編號。

3.迭代器
迭代器的目的就是通過不重寫代碼就可以應用於不同類型的容器。迭代器是一個對象,它的工作是遍歷並選擇序列中的對象,而客戶端程序員不必知道或關係底層的結構。此外,迭代器通常被稱爲輕量級對象:創建它的代價小。因此,經常可以見到對迭代器有些奇怪的限制;例如,java的Iterator只能單向移到,這個Iterator只能用來:
(1)使用iterator()方法要求容器返回一個Iterator。Iterator將準備好返回系列的第一個元素。
(2)使用next()獲得序列中的下一個元素。
(3)使用hasNext()檢查序列中是否還有元素。
(4)使用remove()將迭代器返回的元素刪除。

4.LinkedList
LinkedList也像ArrayList一樣實現了基本的List接口,但是它執行某些操作(在List中間插入和移除)是比ArrayList操作方面要遜色一些。LinkedList還添加了可以使其用作棧、隊列或雙端隊列的方法。這些方法中有些有些彼此之間只是名稱有些差異,或者只存在這些許差異,以使得這些名字在特定用法的上下文環境中更加適用。例如,getFirst()和element()完全一樣,它們都返回列表的頭,而並不移除它,如果List爲空,則拋出NoSuchElementExcetion。peek()方法與這兩個方式只是稍有差異,它在列表爲空是返回null。
removeFirst()與remove()也是完全不一樣的,它們移除並返回列表的頭,而在列表爲空時拋出NoSuchElementExcetion。poll()稍有差異,它在列表爲空是返回null。addfirst()與add()和addLast()相同,它們將某個元素插入到列表的尾部。removeLast()移除並返回列表的最後一個元素。

5.Stack
“棧”通常是指“後進先出”的容器。有時棧也被稱爲疊加棧,因爲最後“壓入”棧的元素,第一個“彈出”棧。LinkedList具有能夠直接實現棧的所有功能的方法,因此可以直接將LinkedList作爲棧使用。不過,有時一個真正的棧更能夠把事情講清楚:

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

}

這裏通過使用泛型,引入了在棧的類定義中最簡單的可行示例。類名之後的告訴編譯器這將時一個參數化類型,而其中的類型參數,即在類被使用時將會被實際類型替換的參數,就是T。大體上,這個類是聲明“我們在定義一個可以持有T類型對象的Stack”。Stack是用LinkedList實現的,而LinkedList也被告知它將持有T類型對象。注意push()接受的是T類型的對象,而peek()和pop()將返回T類型的對象。peek()方法將提供棧頂元素,但是並不將其從棧頂移除,而pop()將移除並返回棧頂元素。

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