1. 程式人生 > >Java編程思想學習筆記-第11章

Java編程思想學習筆記-第11章

none relative gnu script contain ima org reverse equals

Java編程思想學習筆記-第11章

Table of Contents

  • 1. 第十一章-持有對象
    • 1.1. 基本概念
    • 1.2. List
    • 1.3. 叠代器
      • 1.3.1. ListIterator
    • 1.4. LinkedList
    • 1.5. Stack
    • 1.6. Set
    • 1.7. Map
    • 1.8. Queue
    • 1.9. PriorityQueue
    • 1.10. Collection和Iterator
    • 1.11. Foreach與叠代器
    • 1.12. 適配器方法慣用法
    • 1.13. 總結

1 第十一章-持有對象

1.1 基本概念

Java容器類類庫的用途是"保存對象",並將其劃分為兩個不同的概念

  1. Collection: 一個獨立的元素序列,這些元素都服從一條或多條規則.
  2. Map: 一組成對的"鍵值對"對象,允許你使用鍵來查找值.

1.2 List

  1. 基本的ArrayList,它長於隨機訪問元素,但是在List的中間插入和溢出元素時候比較慢
  2. LinkedList,它通過代價較低的在LIst中間進行的插入和刪除操作,提供了優化的順序訪問.LinkedList在隨機訪問方面相對較慢,但是它的特性集較ArrayList更大.
  3. subList()方法允許你很容易地從較大的列表中創建出一個片段.
  4. retainAll()方法是一宗有效的"交集"操作,所產生的行為依賴於equals().
  5. removeAll()方法的行為也是基於equals()方法的.

1.3 叠代器

  1. 叠代器是一個輕量級的對象(創建它的代價小),它的工作是遍歷並選擇序列中的對象,而客戶端程序員不必知道或關心序列底層的結構.
  2. Iterator只能單向移動,這個Iterator只能用來
    • 使用方法iterator()要求容器返回一個Iterator.Iterator將準備好返回序列的第一個元素.
    • 使用next()獲得序列中的下一個元素.
    • 使用hasNext()檢查序列中是否還有元素.
    • 使用reemove()將叠代器當前返回的元素刪除

1.3.1 ListIterator

  1. ListIterator是一個更加強大的Iterator子類型.
  2. ListIterator可以雙向移動.
  3. ListIterator可以產生相對於叠代器在列表中指定當前位置的前一個和後一個元素的索引.
  4. ListIterator可以使用set()方法替換它訪問過的最後一個元素.
  5. 可以使用listIterator()方法產生一個指向List開始處的ListIterator,並且還可以通過調用listIterator(n)方法創建一個一開始就只想列表索引為n的元素處的ListIterator.

1.4 LinkedList

  1. LinkedList同樣實現了List接口,在中間插入和刪除元素時候比ArrayList更高效.
  2. LinkList隨機訪問操作比ArrayList性能要遜色.
  3. LinkedList還添加了可以試用期作為棧,隊列或雙端隊列的方法.
  4. getFirst()和element()完全一樣,它們都返回列表的頭元素,而不移除它.List為空,拋出NoSuchElement-Exception異常.
  5. peek()方法在列表為空時候返回null,其余行為與getFirst()和element()方法一致.
  6. removeFirst()和remove()完全一樣,它們移除並返回列表的頭,而列表為空時,拋出NoSuchElement-Exception異常.
  7. poll()方法在列表為空時候返回null,其余行為與removeFirst()和remove()方法一致.
  8. add()方法addLast()和offer()方法都是添加一個元素到列表尾部.

1.5 Stack

  1. 棧通常是指"後進先出"(LIFO)的容器.
  2. Stack使用LinkedList實現的方式可能更好.

1.6 Set

  1. Set不保存重復的元素.
  2. Set具有與Collection完全一樣的接口,因此沒有額外的功能.
  3. HashSet使用了散列
  4. TreeSet將元素存儲在紅-黑樹數據結構中

1.7 Map

  1. keySet()方法返回Map的鍵的Set
  2. values()方法返回Map的值的Collection

1.8 Queue

  1. 隊列是一個典型的先進先出(FIFO)的容器.
  2. LinkedList提供方法以支持隊列的行為,並且它實現了Queue接口.
  3. offer()方法是將一個元素插入到隊尾,或者返回false.
  4. peek()和element()都將在不移除的情況下返回隊頭,但peek()方法在隊列為空時返回null,element()會拋出NoSuchElementException異常.
  5. poll()和remove()都將移除並返回隊頭,但poll()方法在隊列為空時返回null,remove()會拋出NoSuchElementException異常.

1.9 PriorityQueue

  1. 優先級隊列聲明下一個彈出元素是最需要的元素(具有最高的優先級)
  2. PriorityQueue上調用offer()方法來插入一個對象時,這個對象會在隊列中被排序.
  3. 默認的排序使用對象在隊列中的自然排序,但是可以提供自己的Comparator來修改這個順序.
  4. PriorityQueue可以確保當你調用peek(),poll(),remove()方法時,獲取的元素是隊列中優先級最高的元素.

1.10 Collection和Iterator

  1. Collection是描述所有序列容器的共性的根接口,AbstractCollection提供了Collection的默認實現.
  2. Iterator接口的方法比Collection接口的方法要少,所以在實現Collection接口時會十分麻煩,所以Iterator接口更方便.
  3. 生成Iterator是將隊列與消費隊列的方法連接在一起耦合度最小的方式,並且與實現Collection相比,它在序列類上所事假的約束也少得多.

1.11 Foreach與叠代器

  1. Collection之所以能使用foreach語法遍歷,是因為它實現了Iterable的接口,該接口包含一個能夠產生Iterator的iterator()方法,並且Iterable接口被foreach用來在序列中移動.
  2. foreach語句可以用於數組或其他任何Iterable,但是這並不意味著數組肯定也是一個Iterable,而任何自動包裝也不會自動發生.

1.12 適配器方法慣用法

  1. 場景:你想要添加一種或多種在foreach語句中使用Iterable類的方法,應該怎麽做?
    • 直接繼承這個類,實現iterator()方法.
    • 問題:只能替換現有的方法,不能實現選擇.
  2. 解決方案:添加一個產生Iterable的方法reversed.這是編寫一個適配器的思想,從而不會覆蓋原有的iterator()方法.
package holding;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;

class ReversibleArrayList<T> extends ArrayList<T> {
    public ReversibleArrayList(Collection c) {
        super(c);
    }

    public Iterable<T> reversed() {
        return new Iterable<T>() {
            @Override
            public Iterator<T> iterator() {
                return new Iterator<T>() {
                    int current = size() - 1;
                    @Override
                    public boolean hasNext() {
                        return current > -1;
                    }

                    @Override
                    public T next() {
                        return get(current--);
                    }

                    @Override
                    public void remove() {
                        // Not implemented
                        throw new UnsupportedOperationException();
                    }
                };
            }
        };
    }

}

public class AdapterMethodIdiom {
    public static void main(String[] args) {
        ReversibleArrayList<String> ral = new ReversibleArrayList<>(
                Arrays.asList("To be or not to be".split(" ")));
        // Grabs the ordinary iterator via iterator():
        for (String s : ral) {
            System.out.print(s + " ");
        }
        System.out.println();
        // Hand it the Iterable of your choice
        for (String s : ral.reversed()) {
            System.out.print(s + " ");
        }
    }
}

1.13 總結

  1. 如果要進行大量的隨機訪問,就是用ArrayList,如果要經常從表中間插入或刪除元素,則應該使用LinkedList.
  2. 各種Queue及棧的行為,由LinkedList提供支持.
  3. HashMap設計用來快速訪問.TreeMap保持"鍵"始終處在排序狀態,所以沒有HashMap快.LinkedHashMap保持元素插入的順序,但是也通過散列提供了快速訪問能力.
  4. Set不接受重復元素.HashSet提供最快的查詢速度.TreeSet保持元素處在排序狀態.LinkedHashSet以插入順序保存元素.
  5. 新程序中不應該使用過時的Vector,HashTable和Stack.

技術分享圖片

Date: 2018-10-31 20:56

Author: devinkin

Created: 2018-10-31 三 20:56

Validate

Java編程思想學習筆記-第11章