1. 集(Set):和數學上的“集合”概念相對應,是最簡單的一種集合。
Set集合中不區分元素的順序,因此也就不記錄元素的加入順序。
Set集合中不包含重複元素,即任意的兩個元素e1和e2都有e1.equals(e2)=false,並且最多有一個null元素。
2. 實現了Set介面的類HashSet
“基於散列表”的檢測重複元素的策略:HashSet裡的元素值同這個元素在Set裡所存放的索引位置有個對應關係(散列函數),在HashSet裡插入元素前,可根據這個元素值和對應關係,計算出這個元素在HashSet裡的插入位置,如果在這個位置裡(或位置周圍)已經存在了待插入元素的值,則不能插入。
µ 構造方法
ü HashSet()
ü HashSet(<E> c)
µ 其他方法
ü boolean contains(Object o) 判斷是否存在指定元素
剩下繼承父類的方法。該類中沒有get方法。
4. 第一類集合有著共同的特性:它們儲存的對象都是一元的(線性),只不過儲存的方式和使用的資料結構不同,以Collection為基類--封裝了線性表的插入、刪除等基本操作。
第二類集合的共同特性就是它們存放的資料都是二元的,稱其為“鍵-值”對,通過它們可以快速的根據一個關鍵字key來得到其所對應的值value,這裡之所以稱其為關鍵字就是因為它必須是唯一的,這樣才能保證每次通過key所得到的value是固定的,即最近一次設定進去的那個值value.
List介面和Set介面都是Collection的子介面
實現List介面:基於線性鏈表來存放資料的,例如Vector
實現Set介面:它們不允許有重複的元素,且元素無序(取出的元素跟加入的順序沒關係);例如HashSet。
5. 在Java中,專門建立以Hashtable為代表的“鍵-值”對類型對象,“鍵”--索引資訊,而“值” –同索引值相對應的資訊。
¯ 為什麼要使用“鍵-值”對型的資料結構
µ 原因:便於資訊檢索,提高在大資料量裡檢索資訊的速度。
µ 工作原理
(1)如果要從其中查詢指定資料的話,不得不依次遍曆這個數組,這樣效率會很低。
(2)換一種思路:將10存入數組不是插入在第一個空閑空間裡。
µ 存在“索引衝突” 問題:對於散列函數,不同的“值”會得到相同的“鍵”,即不同的對象可能存放在同一個索引位置上。
µ 解決方案
ü 採用技術上的方法,例如設計出盡量降低衝突情況出現的散列函數,或者是指定衝突發生時的應對策略;
ü 根據待儲存的資料量,適當提高Hash表的容量--用加大空間的代價,來取衝突發生的低機率
新問題:如何根據Hash表裡的儲存資料量,開闢Hash表的儲存空間。
è裝載因子:Hash表裡實際容納對象的比率,75%最合適
6. “鍵-值”對的典範——Hashtable類
在Java的“鍵-值”對型集合類裡,已經封裝了用散列函數最佳化其中資料搜尋效率以及處理Hash表裡資料衝突的實現細節。其中Hashtable是 “鍵-值”對型集合類的典範。
µ 構造方法
ü Hashtable()
ü Hashtable(int initialCapacity)
ü Hashtable(int initialCapacity, floatloadFactor)
ü Hashtable(<K,V> t)
µ 其它方法
ü V put(K key, V value):向Hashtable對象中插入“鍵-值”對
ü V get(Object key):根據key這個“鍵”從Hashtable對象中檢索到 對應的“值”
例如,ht.put(new Integer(1),new String(“Tom”));
Stringstr=ht.get(new Integer(1));
ü boolean containsKey(Object key)
判斷“鍵”是否存在於Hashtable對象中。
ü boolean containsValue(Object value)
判斷“值” 是否存在於Hashtable中。
例如,boolean flag=ht.containsKey(new Integer(2));
flag=ht.containsValue(“Rose”);
ü public boolean contains(Object value) 同containsValue()方法。
ü public void clear()
將此Hashtable清空,使其不包含任何鍵。
7. 列舉程式是一個用來訪問集合元素的工具,它不僅提供了可以用來訪問集合的若干方法,更展示瞭解決訪問對象時“物件類型不確定”難題的思路。
¯ 訪問集合類的“不確定性”難題
Java中有諸多不同類型的Java集合類(比如Vector或List),程式員希望用同一類型的方式來訪問其中的資料。
¯ 列舉程式介面
java.util.Iterator(列舉程式介面)封裝“無差別訪問集合對象”的方法。
8. 相關方法
ü 在每一個集合類(比如Vector或Hashtable等)裡,都有一個iterator()方法,各集合對象可以通過該方法把遍曆本類的控制權交給Iterator介面。
ü 在Iterator的介面裡,提供了boolean hasNext()方法,判斷出是否可以通過列舉程式來得到集合對象中的下一個元素。
ü 在Iterator的介面裡,提供了E next()方法,用來擷取集合對象裡的下一個元素,它返回的是一個泛型對象。
9.列舉程式“分離”思想
µ “遍曆不同種類的集合對象” 採用“分離”的設計思想;
µ 把遍曆這個業務動作同將要實施遍曆操作的對象(比如集合)分離,在這個基礎上,抽象出遍曆不同集合對象的共性代碼,並把這些功能代碼封裝到列舉程式這個介面裡,就可以用同一套代碼,來遍曆不同類型的集合;
µ 正是由於列舉程式分離了業務動作(枚舉)和業務動作要操作的資料(集合),所以它才能以不變應萬變。
10.倒包時,用具體類或*是一樣的,不影響運行速率。