1. 程式人生 > >Java程式設計思想之讀書筆記系列九 --- 第十一章 --- 持有物件

Java程式設計思想之讀書筆記系列九 --- 第十一章 --- 持有物件

  • 基本的容器類:List, Set, Queue和Map
  • Java容器類都可以自動地調整自己的尺寸
  • 可以使用註解來抑制警告資訊:註解以“@”開頭,可以接收引數,比如 @SuppressWarnings("unchecked")表示只有有關“不受檢查的異常”的警告資訊應該被抑制
  • 容器類的尖括號括起來的是引數型別,可以有多個
  • Object預設的toString()方法:列印類名,後面跟隨該物件雜湊碼的無符號十六進位制表示
  • 容器可以分為兩類:Collection和Map。Collection是一個獨立元素的序列,這些元素都服從一條或多條規則;Map,一組成對的“鍵值對”物件,允許你使用鍵來查詢值
  • Collection的構造器可以接受另一個Collection,用它來將自身初始化,但是Collection.addAll()方法執行起來要快得多,因此新建一個空白Collection,然後使用Collection.addAll()方法是首選方式
  • 可以直接使用Arrays.asList()的輸出作為List,但是這種情況下,就無法調整大小了,因為底層表示的是陣列
  • 可以在Arrays.asList()中間插入一條線索,以告訴編譯器對於由Arrays.asList()產生的List型別,實際的目標型別應該是什麼,這樣可以解決子類父類之間的問題。例項如:Arrays.<Snow>asList(newLight(), newHeavy());
  • 使用Arrays.toString()方法可以產生陣列的可打印表示,而容器類無需任何幫助即可打印出內容
  • LinkedList包含的操作多於ArrayList
  • HashSet使用了相當複雜的儲存方式來儲存元素,而且這種技術是最快的獲取元素的方式;TreeSet按照比較結果的升序儲存物件;LinkedHashSet按照被新增的順序儲存物件
  • 與HashSet一樣,HashMap也提供了最快的查詢技術;TreeMap按照比較結果的升序儲存鍵;LinkedHashMap按照插入順序儲存鍵,同時還保留了HashMap的查詢速度
  • Collections.shuffle()隨機打亂原來的順序;retainAll()方法是一種有效的“交集”操作,當然,它所產生的行為依賴於equals()方法;addAll(),通過方法的過載,既可以追加到表尾,也可以在中間插入新的列表;toArray()也存在方法過載,預設返回的是Object陣列,但是可以通過傳遞目標型別的資料,那麼它將產生指定型別的資料
  • List的行為根據equals的行為而有所變化,因為確定一個元素是否屬於某個List,發現某個元素的索引,以及從某個List中移除一個元素時,都會用到equals()方法
  • 長度為0的陣列,叫做空陣列,輔助作用,比如作為一個型別
  • 迭代器統一了容器的訪問方式,能夠將遍歷序列的操作與序列底層的結構分離
  • Iterator和ListIterator,父類和子類的關係,但是ListIterator提供了更多的功能,兩種可分別通過iterator()方法和listIterator()方法獲得
  • LinkedList還添加了可以使其用作棧、佇列或雙端佇列的方法,方法很多,比如getFirst(),element()和peek(),removeFirst(),remove()和poll(),addFirst(),add()和addLast(),removeLast()
  • java中的stack類:java.util.Stack;使用LinkedList可以直接實現一個Stack
  • TreeSet將元素儲存在紅-黑樹結構當中,而HashSet則儲存在散列當中,LinkedHashSet也是儲存在雜湊裡,不過使用連結串列維護了插入元素的順序
  • Map裡的方法:containsKey()和containsValue(),用於判斷是否包含特定的鍵和值;keySet()方法和values()方法分別返回map裡的鍵集合和值集合
  • 佇列在併發程式設計中特別重要;LinkedList提供了方法以支援佇列的行為,並且它實現了Queue介面,可以將LinkedList向上轉型為Queue
  • Queue的方法:peek()和element()都將在不移除的情況下返回隊頭,但是peek()在佇列為空時返回null,而element()會丟擲NoSuchElementException異常;remove()和poll()方法都將移除並返回隊頭, 但是poll()在佇列為空時返回null,而remove()會丟擲NoSuchElementException異常;offer()在允許的情況下向佇列尾部插入一個元素,否則返回false
  • 優先佇列:優先順序佇列宣告下一個彈出的元素是最需要的元素(具有最高的優先順序)
  • 標準C++類庫中並沒有其容器的任何公共基類——容器之間所有的共性都是通過迭代器完成的
  • Collection和Iterator:Iterator會更靈活一些
  • 任何實現了Iterable的類都可以用於foreach,因為foreach就是利用Iterable介面來在序列中移動
  • 陣列和Iterable無法自動轉換
  • 當你有一個介面並需要另一個介面時,編寫介面卡就可以解決問題,即介面卡模式
  • 新程式中不應該使用過時的Vector,HashTable和Stack
  • 容器分類