2007年11月15日 星期四

Head First Java 讀後整理(13) - Data Structures

1、ArrayList:在 Java 中最常被使用到的 collection structure,但是沒有排序的功能
但是還是可以使用 Collectins.sort() 來進行資料的排序

2、TreeSet:以排序過後的狀態保存,並可防止重複

3、HashMap:可用成對 name/value 來儲存或取出資料

4、LinkedList:針對經常 insert / delete 中間元素的行為,處理效率較好

5、HashSet:防止重複的集合,並可快速的尋找相符的元素

6、LinkedHashMap:類似 HashMap,但可記住元素的 insert 順序,也可以設定成依照原入上次的存取先後進行排序

7、Generic 代表更好的型別安全性
幾乎以 generic 寫的程式都跟處理 collection 有關,透過 generic 可以讓 compiler 在編譯期間發現型別的錯誤,而不需等到 Run-Time 的時候才會發現。
舉例來說,在 JDK 5.0 之前,collection 都是用 Object 在處理的! 因此把綿羊 object 送到老虎 collection 中是不會有問題的。

8、使用 generic 關鍵的兩個部分:
(1) class 的宣告
(2) 新增元素的 method 的宣告

//E 部分會用所宣告與建構的真正型別來取代
//ArrayList 為 AbstractList 的 subclass,所以指定給 ArrayList 的型別會自動用在 AbstractList 上
public class ArrayList<E> extends AbstractList<E> implements List<E> {
//E 用來指示可以加入 ArrayList 的元素型別
public boolean add(E 0) {
//......
} //close add
} //close ArrayList

9、<T exntends Animal> 與 <Animal> 是不一樣的
首先說明,以下兩個語法都是合法的,但是意義不同!
//可使用任何一種 Animal 的 ArrayList
public <T extends Animal> void takeThing(ArrayList<T> list)
//只能使用 Animal 的 ArrayList
public void takeThing(ArrayList<Animal> list)

10、以 generic 的觀念來說,「extends」代表 extend 或 implement
//Comparable 是個 interface
//因此這可以讀作 => T 必須是個有 implements 過 Comparable interface 的型別
public static <T extends Comparable<? super T>> void sort(List<T> list)

11、List 排序的方式:
(1) 呼叫單一參數的 sort(List o),代表由 List 元素上的 compareTo() 來決定順序。

(2) 呼叫 sort(List o, Comparator c) 代表不會呼叫 List 元素的 compareTo(),而會使用 Comparator 的 compare(),代表 List 元素不需要實作 Comparable interface。

12、判斷 object 是否相同
(1) 參考相等性:heap 上同一個 object 的兩個參考
(2) 物件相等性:heap 上兩個不同 object,但在意義上是相同的

13、HashSet 檢查重複方式:檢查 hashcode() 的值是否相同,再使用 equal() 檢查是否相同
因為 hashcode() 使用的 Hash Function,有可能會讓多個 object 傳回相同的 hash code,這是 Hash Function 的問題。

14、如果兩個 object 有相同的 hashcode,不一定是相同;但若兩個 object 相同,則 hashcode 一定是相同的

15、若 equal() 被 override 過,則 hashcode() 也必須被 override

16、equal() 的預設行為是執行 == 的比較,也就是測試兩個參考是否指向 heap 上相同的 object

17、TreeSet 的元素必須是 Comparable,而要使用 TreeSet必須滿足下面其中一個條件:
(1) collection 中的元素必須有實作 Comparable interface
(2) 使用有實作 Comparator interface 的 class 所產生的 object,作為 TreeSet constructor 的參數

18、如果需要用名稱來取得值,選用 Map collection 是比較推薦的作法

19、array 的型別在 Run Time 檢查,但 collection 的型別檢查只會發生在編譯期間
所以 Dog 與 Cat 不能當作參數加入 ArrayList<Animal> 中。

除非 collection 換成 ArrayList<? extends Animal>;但若此方式用在 method 的參數時,只能讀取 collection 中的元素而不能新增,因為 compiler 會避免此種行為造成程式在 Run Time 時發生錯誤。

沒有留言:

張貼留言