1. 程式人生 > >java集合介面(5)

java集合介面(5)

Java 2集合框架圖
  集合介面:6個介面(短虛線表示),表示不同集合型別,是集合框架的基礎。
  抽象類:5個抽象類(長虛線表示),對集合介面的部分實現。可擴充套件為自定義集合類。
  實現類:8個實現類(實線表示),對介面的具體實現。
  在很大程度上,一旦您理解了介面,您就理解了框架。雖然您總要建立介面特定的實現,但訪問實際集合的方法應該限制在介面方法的使用上;因此,允許您更改基本的資料結構而不必改變其它程式碼。
  • Collection 介面是一組允許重複的物件。
  • Set 介面繼承 Collection,但不允許重複,使用自己內部的一個排列機制。
  • List 介面繼承 Collection,允許重複,以元素安插的次序來放置元素,不會重新排列。
  • Map介面是一組成對的鍵-值物件,即所持有的是key-value pairs。Map中不能有重複的key。擁有自己的內部排列機制。
  • 容器中的元素型別都為Object。從容器取得元素時,必須把它轉換成原來的型別。
Java 2簡化集合框架圖

集合介面
  1.Collection 介面
  用於表示任何物件或元素組。想要儘可能以常規方式處理一組元素時,就使用這一介面。

 (1) 單元素新增、刪除操作:
   boolean add(Object o):將物件新增給集合
   boolean remove(Object o): 如果集合中有與o相匹配的物件,則刪除物件.
  (2) 查詢操作:
   int size() :返回當前集合中元素的數量
   boolean isEmpty() :判斷集合中是否有任何元素
   boolean contains(Object o) :查詢集合中是否含有物件o
   Iterator iterator() :返回一個迭代器,用來訪問集合中的各個元素
  (3) 組操作 :作用於元素組或整個集合
   boolean containsAll(Collection c): 查詢集合中是否含有集合c 中所有元素
   boolean addAll(Collection c) : 將集合c 中所有元素新增給該集合
   void clear(): 刪除集合中所有元素
   void removeAll(Collection c) : 從集合中刪除集合c 中的所有元素
   void retainAll(Collection c) : 從集合中刪除集合c 中不包含的元素
 (4) Collection轉換為Object陣列 :
   Object[] toArray() :返回一個內含集合所有元素的array
   Object[] toArray(Object[] a) :返回一個內含集合所有元素的array。執行期返回的array和引數a的型別相同,需要轉換為正確型別。
  此外,您還可以把集合轉換成其它任何其它的物件陣列。但是,您不能直接把集合轉換成基本資料型別的陣列,因為集合必須持有物件。
  “斜體介面方法是可選的。因為一個介面實現必須實現所有介面方法,呼叫程式就需要一種途徑來知道一個可選的方法是不是不受支援。如果呼叫一種可選方法時,一個 UnsupportedOperationException 被丟擲,則操作失敗,因為方法不受支援。此異常類繼承 RuntimeException 類,避免了將所有集合操作放入 try-catch 塊。”
  Collection不提供get()方法。如果要遍歷Collectin中的元素,就必須用Iterator。
  1.1.AbstractCollection 抽象類
  AbstractCollection 類提供具體“集合框架”類的基本功能。雖然您可以自行實現 Collection 介面的所有方法,但是,除了iterator()和size()方法在恰當的子類中實現以外,其它所有方法都由 AbstractCollection 類來提供實現。如果子類不覆蓋某些方法,可選的如add()之類的方法將丟擲異常。
  1.2.Iterator 介面
  Collection 介面的iterator()方法返回一個 Iterator。Iterator介面方法能以迭代方式逐個訪問集合中各個元素,並安全的從Collection 中除去適當的元素。

  (1) boolean hasNext(): 判斷是否存在另一個可訪問的元素
    Object next(): 返回要訪問的下一個元素。如果到達集合結尾,則丟擲NoSuchElementException異常。
  (2) void remove(): 刪除上次訪問返回的物件。本方法必須緊跟在一個元素的訪問後執行。如果上次訪問後集合已被修改,方法將丟擲IllegalStateException。
  “Iterator中刪除操作對底層Collection也有影響。”
  迭代器是 故障快速修復(fail-fast)的。這意味著,當另一個執行緒修改底層集合的時候,如果您正在用 Iterator 遍歷集合,那麼,Iterator就會丟擲 ConcurrentModificationException (另一種 RuntimeException異常)異常並立刻失敗。
 2.List介面
  List 介面繼承了 Collection 介面以定義一個允許重複項的有序集合。該介面不但能夠對列表的一部分進行處理,還添加了面向位置的操作。


  (1) 面向位置的操作包括插入某個元素或 Collection 的功能,還包括獲取、除去或更改元素的功能。在 List 中搜索元素可以從列表的頭部或尾部開始,如果找到元素,還將報告元素所在的位置 :
  void add(int index, Object element): 在指定位置index上新增元素element
  boolean addAll(int index, Collection c): 將集合c的所有元素新增到指定位置index
  Object get(int index): 返回List中指定位置的元素
  int indexOf(Object o): 返回第一個出現元素o的位置,否則返回-1
  int lastIndexOf(Object o) :返回最後一個出現元素o的位置,否則返回-1
  Object remove(int index) :刪除指定位置上的元素
  Object set(int index, Object element) :用元素element取代位置index上的元素,並且返回舊的元素
  (2) List 介面不但以位置序列迭代的遍歷整個列表,還能處理集合的子集:
   ListIterator listIterator() : 返回一個列表迭代器,用來訪問列表中的元素
   ListIterator listIterator(int index) : 返回一個列表迭代器,用來從指定位置index開始訪問列表中的元素
  List subList(int fromIndex, int toIndex) :返回從指定位置fromIndex(包含)到toIndex(不包含)範圍中各個元素的列表檢視
  “對子列表的更改(如 add()、remove() 和 set() 呼叫)對底層 List 也有影響。”
  2.1.ListIterator介面
  ListIterator 介面繼承 Iterator 介面以支援新增或更改底層集合中的元素,還支援雙向訪問。ListIterator沒有當前位置,游標位於呼叫previous和next方法返回的值之間。一個長度為n的列表,有n+1個有效索引值:


 (1) void add(Object o): 將物件o新增到當前位置的前面
   void set(Object o): 用物件o替代next或previous方法訪問的上一個元素。如果上次呼叫後列表結構被修改了,那麼將丟擲IllegalStateException異常。
  (2) boolean hasPrevious(): 判斷向後迭代時是否有元素可訪問
   Object previous():返回上一個物件
   int nextIndex(): 返回下次呼叫next方法時將返回的元素的索引
   int previousIndex(): 返回下次呼叫previous方法時將返回的元素的索引
  “正常情況下,不用ListIterator改變某次遍歷集合元素的方向 — 向前或者向後。雖然在技術上可以實現,但previous() 後立刻呼叫next(),返回的是同一個元素。把呼叫 next()和previous()的順序顛倒一下,結果相同。”
  “我們還需要稍微再解釋一下 add() 操作。新增一個元素會導致新元素立刻被新增到隱式游標的前面。因此,新增元素後呼叫 previous() 會返回新元素,而呼叫 next() 則不起作用,返回新增操作之前的下一個元素。”
  2.2.AbstractList和AbstractSequentialList抽象類
  有兩個抽象的 List 實現類:AbstractList 和 AbstractSequentialList。像 AbstractSet 類一樣,它們覆蓋了 equals() 和 hashCode() 方法以確保兩個相等的集合返回相同的雜湊碼。若兩個列表大小相等且包含順序相同的相同元素,則這兩個列表相等。這裡的 hashCode() 實現在 List 介面定義中指定,而在這裡實現。
  除了equals()和hashCode(),AbstractList和AbstractSequentialList實現了其餘 List 方法的一部分。因為資料的隨機訪問和順序訪問是分別實現的,使得具體列表實現的建立更為容易。需要定義的一套方法取決於您希望支援的行為。您永遠不必親自提供的是 iterator方法的實現。
  2.3. LinkedList類和ArrayList類
  在“集合框架”中有兩種常規的 List 實現:ArrayList 和 LinkedList。使用兩種 List 實現的哪一種取決於您特定的需要。如果要支援隨機訪問,而不必在除尾部的任何位置插入或除去元素,那麼,ArrayList 提供了可選的集合。但如果,您要頻繁的從列表的中間位置新增和除去元素,而只要順序的訪問列表元素,那麼,LinkedList 實現更好。
  “ArrayList 和 LinkedList 都實現 Cloneable 介面,都提供了兩個建構函式,一個無參的,一個接受另一個Collection”
  2.3.1. LinkedList類
  LinkedList類添加了一些處理列表兩端元素的方法
LinkedList類添加了一些處理列表兩端元素的方法。

  (1) void addFirst(Object o): 將物件o新增到列表的開頭
    void addLast(Object o):將物件o新增到列表的結尾
  (2) Object getFirst(): 返回列表開頭的元素
    Object getLast(): 返回列表結尾的元素
  (3) Object removeFirst(): 刪除並且返回列表開頭的元素
    Object removeLast():刪除並且返回列表結尾的元素
  (4) LinkedList(): 構建一個空的連結列表
    LinkedList(Collection c): 構建一個連結列表,並且新增集合c的所有元素
  “使用這些新方法,您就可以輕鬆的把 LinkedList 當作一個堆疊、佇列或其它面向端點的資料結構。”
  2.3.2. ArrayList類
  ArrayList類封裝了一個動態再分配的Object[]陣列。每個ArrayList物件有一個capacity。這個capacity表示儲存列表中元素的陣列的容量。當元素新增到ArrayList時,它的capacity在常量時間內自動增加。
  在向一個ArrayList物件新增大量元素的程式中,可使用ensureCapacity方法增加capacity。這可以減少增加重分配的數量。
  (1) void ensureCapacity(int minCapacity): 將ArrayList物件容量增加minCapacity
  (2) void trimToSize(): 整理ArrayList物件容量為列表當前大小。程式可使用這個操作減少ArrayList物件儲存空間。
  2.3.2.1. RandomAccess介面
  一個特徵介面。該介面沒有任何方法,不過你可以使用該介面來測試某個集合是否支援有效的隨機訪問。ArrayList和Vector類用於實現該介面。
3.Set介面
  Set 介面繼承 Collection 介面,而且它不允許集合中存在重複項,每個具體的 Set 實現類依賴新增的物件的 equals()方法來檢查獨一性。Set介面沒有引入新方法,所以Set就是一個Collection,只不過其行為不同。

  3.1. Hash表
  Hash表是一種資料結構,用來查詢物件。Hash表為每個物件計算出一個整數,稱為Hash Code(雜湊碼)。Hash表是個連結式列表的陣列。每個列表稱為一個buckets(雜湊表元)。物件位置的計算 index = HashCode % buckets (HashCode為物件雜湊碼,buckets為雜湊表元總數)。
  當你新增元素時,有時你會遇到已經填充了元素的雜湊表元,這種情況稱為Hash Collisions(雜湊衝突)。這時,你必須判斷該元素是否已經存在於該雜湊表中。
  如果雜湊碼是合理地隨機分佈的,並且雜湊表元的數量足夠大,那麼雜湊衝突的數量就會減少。同時,你也可以通過設定一個初始的雜湊表元數量來更好地控制雜湊表的執行。初始雜湊表元的數量為 buckets = size * 150% + 1 (size為預期元素的數量)。
  如果雜湊表中的元素放得太滿,就必須進行rehashing(再雜湊)。再雜湊使雜湊表元數增倍,並將原有的物件重新匯入新的雜湊表元中,而原始的雜湊表元被刪除。load factor(載入因子)決定何時要對雜湊表進行再雜湊。在Java程式語言中,載入因子預設值為0.75,預設雜湊表元為101。
  3.2. Comparable介面和Comparator介面
  在“集合框架”中有兩種比較介面:Comparable介面和Comparator介面。像String和Integer等Java內建類實現Comparable介面以提供一定排序方式,但這樣只能實現該介面一次。對於那些沒有實現Comparable介面的類、或者自定義的類,您可以通過Comparator介面來定義您自己的比較方式。
  3.2.1. Comparable介面
  在java.lang包中,Comparable介面適用於一個類有自然順序的時候。假定物件集合是同一型別,該介面允許您把集合排序成自然順序。



  (1) int compareTo(Object o): 比較當前例項物件與物件o,如果位於物件o之前,返回負值,如果兩個物件在排序中位置相同,則返回0,如果位於物件o後面,則返回正值

  在 Java 2 SDK版本1.4中有二十四個類實現Comparable介面。下表展示了8種基本型別的自然排序。雖然一些類共享同一種自然排序,但只有相互可比的類才能排序。

類 排序
BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short 按數字大小排序
Character 按 Unicode 值的數字大小排序
String 按字串中字元 Unicode 值排序
類 排序
BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short 按數字大小排序
Character 按 Unicode 值的數字大小排序
String 按字串中字元 Unicode 值排序
   利用Comparable介面建立您自己的類的排序順序,只是實現compareTo()方法的問題。通常就是依賴幾個資料成員的自然排序。同時類也應該覆蓋equals()和hashCode()以確保兩個相等的物件返回同一個雜湊碼。
  3.2.2. Comparator介面
  若一個類不能用於實現java.lang.Comparable,或者您不喜歡預設的Comparable行為並想提供自己的排序順序(可能多種排序方式),你可以實現Comparator介面,從而定義一個比較器。

  (1)int compare(Object o1, Object o2): 對兩個物件o1和o2進行比較,如果o1位於o2的前面,則返回負值,如果在排序順序中認為o1和o2是相同的,返回0,如果o1位於o2的後面,則返回正值
  “與Comparable相似,0返回值不表示元素相等。一個0返回值只是表示兩個物件排在同一位置。由Comparator使用者決定如何處理。如果兩個不相等的元素比較的結果為零,您首先應該確信那就是您要的結果,然後記錄行為。”
  (2)boolean equals(Object obj): 指示物件obj是否和比較器相等。
  “該方法覆寫Object的equals()方法,檢查的是Comparator實現的等同性,不是處於比較狀態下的物件。”
3.3. SortedSet介面
  “集合框架”提供了個特殊的Set介面:SortedSet,它保持元素的有序順序。SortedSet介面為集的檢視(子集)和它的兩端(即頭和尾)提供了訪問方法。當您處理列表的子集時,更改檢視會反映到源集。此外,更改源集也會反映在子集上。發生這種情況的原因在於檢視由兩端的元素而不是下標元素指定,所以如果您想要一個特殊的高階元素(toElement)在子集中,您必須找到下一個元素。
  新增到SortedSet實現類的元素必須實現Comparable介面,否則您必須給它的建構函式提供一個Comparator介面的實現。TreeSet類是它的唯一一份實現。
  “因為集必須包含唯一的項,如果新增元素時比較兩個元素導致了0返回值(通過Comparable的compareTo()方法或Comparator的compare()方法),那麼新元素就沒有新增進去。如果兩個元素相等,那還好。但如果它們不相等的話,您接下來就應該修改比較方法,讓比較方法和 equals() 的效果一致。”

  (1) Comparator comparator(): 返回對元素進行排序時使用的比較器,如果使用Comparable介面的compareTo()方法對元素進行比較,則返回null
  (2) Object first(): 返回有序集合中第一個(最低)元素
  (3) Object last(): 返回有序集合中最後一個(最高)元素
  (4) SortedSet subSet(Object fromElement, Object toElement): 返回從fromElement(包括)至toElement(不包括)範圍內元素的SortedSet檢視(子集)
  (5) SortedSet headSet(Object toElement): 返回SortedSet的一個檢視,其內各元素皆小於toElement
  (6) SortedSet tailSet(Object fromElement): 返回SortedSet的一個檢視,其內各元素皆大於或等於fromElement
  3.4. AbstractSet抽象類
  AbstractSet類覆蓋了Object類的equals()和hashCode()方法,以確保兩個相等的集返回相同的雜湊碼。若兩個集大小相等且包含相同元素,則這兩個集相等。按定義,集的雜湊碼是集中元素雜湊碼的總和。因此,不論集的內部順序如何,兩個相等的集會有相同的雜湊碼。
  3.4.1. Object類
  (1) boolean equals(Object obj): 對兩個物件進行比較,以便確定它們是否相同
  (2) int hashCode(): 返回該物件的雜湊碼。相同的物件必須返回相同的雜湊碼
  3.5. HashSet類類和TreeSet類
  “集合框架”支援Set介面兩種普通的實現:HashSet和TreeSet(TreeSet實現SortedSet介面)。在更多情況下,您會使用 HashSet 儲存重複自由的集合。考慮到效率,新增到 HashSet 的物件需要採用恰當分配雜湊碼的方式來實現hashCode()方法。雖然大多數系統類覆蓋了 Object中預設的hashCode()和equals()實現,但建立您自己的要新增到HashSet的類時,別忘了覆蓋 hashCode()和equals()。
  當您要從集合中以有序的方式插入和抽取元素時,TreeSet實現會有用處。為了能順利進行,新增到TreeSet的元素必須是可排序的。
  3.5.1.HashSet類
  (1) HashSet(): 構建一個空的雜湊集
  (2) HashSet(Collection c): 構建一個雜湊集,並且新增集合c中所有元素
  (3) HashSet(int initialCapacity): 構建一個擁有特定容量的空雜湊集
  (4) HashSet(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空雜湊集。LoadFactor是0.0至1.0之間的一個數
  3.5.2. TreeSet類
  (1) TreeSet():構建一個空的樹集
  (2) TreeSet(Collection c): 構建一個樹集,並且新增集合c中所有元素
  (3) TreeSet(Comparator c): 構建一個樹集,並且使用特定的比較器對其元素進行排序
  “comparator比較器沒有任何資料,它只是比較方法的存放器。這種物件有時稱為函式物件。函式物件通常在“執行過程中”被定義為匿名內部類的一個例項。”
  TreeSet(SortedSet s): 構建一個樹集,新增有序集合s中所有元素,並且使用與有序集合s相同的比較器排序
  3.6. LinkedHashSet類
  LinkedHashSet擴充套件HashSet。如果想跟蹤新增給HashSet的元素的順序,LinkedHashSet實現會有幫助。LinkedHashSet的迭代器按照元素的插入順序來訪問各個元素。它提供了一個可以快速訪問各個元素的有序集合。同時,它也增加了實現的代價,因為雜湊表元中的各個元素是通過雙重連結式列表連結在一起的。
  (1) LinkedHashSet(): 構建一個空的連結式雜湊集
  (2) LinkedHashSet(Collection c): 構建一個連結式雜湊集,並且新增集合c中所有元素
  (3) LinkedHashSet(int initialCapacity): 構建一個擁有特定容量的空連結式雜湊集
  (4) LinkedHashSet(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空連結式雜湊集。LoadFactor是0.0至1.0之間的一個數
  “為優化HashSet空間的使用,您可以調優初始容量和負載因子。TreeSet不包含調優選項,因為樹總是平衡的。”
4. Map介面
  Map介面不是Collection介面的繼承。Map介面用於維護鍵/值對(key/value pairs)。該介面描述了從不重複的鍵到值的對映。

  (1) 新增、刪除操作:
  Object put(Object key, Object value): 將互相關聯的一個關鍵字與一個值放入該映像。如果該關鍵字已經存在,那麼與此關鍵字相關的新值將取代舊值。方法返回關鍵字的舊值,如果關鍵字原先並不存在,則返回null
  Object remove(Object key): 從映像中刪除與key相關的對映
  void putAll(Map t): 將來自特定映像的所有元素新增給該映像
  void clear(): 從映像中刪除所有對映
  “鍵和值都可以為null。但是,您不能把Map作為一個鍵或值新增給自身。”
  (2) 查詢操作:
  Object get(Object key): 獲得與關鍵字key相關的值,並且返回與關鍵字key相關的物件,如果沒有在該映像中找到該關鍵字,則返回null

  boolean containsKey(Object key): 判斷映像中是否存在關鍵字key
  boolean containsValue(Object value): 判斷映像中是否存在值value
  int size(): 返回當前映像中對映的數量
  boolean isEmpty() :判斷映像中是否有任何對映
  (3) 檢視操作 :處理映像中鍵/值對組
 Set keySet(): 返回映像中所有關鍵字的檢視集
  “因為對映中鍵的集合必須是唯一的,您用Set支援。你還可以從檢視中刪除元素,同時,關鍵字和它相關的值將從源映像中被刪除,但是你不能新增任何元素。”
  Collection values():返回映像中所有值的檢視集
  “因為對映中值的集合不是唯一的,您用Collection支援。你還可以從檢視中刪除元素,同時,值和它的關鍵字將從源映像中被刪除,但是你不能新增任何元素。”
  Set entrySet(): 返回Map.Entry物件的檢視集,即映像中的關鍵字/值對
  “因為對映是唯一的,您用Set支援。你還可以從檢視中刪除元素,同時,這些元素將從源映像中被刪除,但是你不能新增任何元素。”
  4.1. Map.Entry介面
  Map的entrySet()方法返回一個實現Map.Entry介面的物件集合。集合中每個物件都是底層Map中一個特定的鍵/值對。

  通過這個集合的迭代器,您可以獲得每一個條目(唯一獲取方式)的鍵或值並對值進行更改。當條目通過迭代器返回後,除非是迭代器自身的remove()方法或者迭代器返回的條目的setValue()方法,其餘對源Map外部的修改都會導致此條目集變得無效,同時產生條目行為未定義。
  (1) Object getKey(): 返回條目的關鍵字
  (2) Object getValue(): 返回條目的值
  (3) Object setValue(Object value): 將相關映像中的值改為value,並且返回舊值
  4.2. SortedMap介面
  “集合框架”提供了個特殊的Map介面:SortedMap,它用來保持鍵的有序順序。

  SortedMap介面為映像的檢視(子集),包括兩個端點提供了訪問方法。除了排序是作用於對映的鍵以外,處理SortedMap和處理SortedSet一樣。
  新增到SortedMap實現類的元素必須實現Comparable介面,否則您必須給它的建構函式提供一個Comparator介面的實現。TreeMap類是它的唯一一份實現。
  “因為對於對映來說,每個鍵只能對應一個值,如果在新增一個鍵/值對時比較兩個鍵產生了0返回值(通過Comparable的compareTo()方法或通過Comparator的compare()方法),那麼,原始鍵對應值被新的值替代。如果兩個元素相等,那還好。但如果不相等,那麼您就應該修改比較方法,讓比較方法和 equals() 的效果一致。”
  (1) Comparator comparator(): 返回對關鍵字進行排序時使用的比較器,如果使用Comparable介面的compareTo()方法對關鍵字進行比較,則返回null
  (2) Object firstKey(): 返回映像中第一個(最低)關鍵字
  (3) Object lastKey(): 返回映像中最後一個(最高)關鍵字
  (4) SortedMap subMap(Object fromKey, Object toKey): 返回從fromKey(包括)至toKey(不包括)範圍內元素的SortedMap檢視(子集)
  (5) SortedMap headMap(Object toKey): 返回SortedMap的一個檢視,其內各元素的key皆小於toKey
  (6) SortedSet tailMap(Object fromKey): 返回SortedMap的一個檢視,其內各元素的key皆大於或等於fromKey
  4.3. AbstractMap抽象類
  和其它抽象集合實現相似,AbstractMap 類覆蓋了equals()和hashCode()方法以確保兩個相等對映返回相同的雜湊碼。如果兩個對映大小相等、包含同樣的鍵且每個鍵在這兩個對映中對應的值都相同,則這兩個對映相等。對映的雜湊碼是對映元素雜湊碼的總和,其中每個元素是Map.Entry介面的一個實現。因此,不論對映內部順序如何,兩個相等對映會報告相同的雜湊碼。
  4.4. HashMap類和TreeMap類
  “集合框架”提供兩種常規的Map實現:HashMap和TreeMap (TreeMap實現SortedMap介面)。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。使用HashMap要求新增的鍵類明確定義了hashCode()和equals()的實現。
  這個TreeMap沒有調優選項,因為該樹總處於平衡狀態。
  4.4.1. HashMap類
  為了優化HashMap空間的使用,您可以調優初始容量和負載因子。
  (1) HashMap(): 構建一個空的雜湊映像
  (2) HashMap(Map m): 構建一個雜湊映像,並且新增映像m的所有對映
  (3) HashMap(int initialCapacity): 構建一個擁有特定容量的空的雜湊映像
  (4) HashMap(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空的雜湊映像
  4.4.2. TreeMap類
  TreeMap沒有調優選項,因為該樹總處於平衡狀態。
  (1) TreeMap():構建一個空的映像樹
  (2) TreeMap(Map m): 構建一個映像樹,並且新增映像m中所有元素
  (3) TreeMap(Comparator c): 構建一個映像樹,並且使用特定的比較器對關鍵字進行排序
  (4) TreeMap(SortedMap s): 構建一個映像樹,新增映像樹s中所有對映,並且使用與有序映像s相同的比較器排序
  4.5. LinkedHashMap類
  LinkedHashMap擴充套件HashMap,以插入順序將關鍵字/值對新增進連結雜湊映像中。象LinkedHashSet一樣,LinkedHashMap內部也採用雙重連結式列表。
  (1) LinkedHashMap(): 構建一個空連結雜湊映像
  (2) LinkedHashMap(Map m): 構建一個連結雜湊映像,並且新增映像m中所有對映
  (3) LinkedHashMap(int initialCapacity): 構建一個擁有特定容量的空的連結雜湊映像
  (4) LinkedHashMap(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空的連結雜湊映像
  (5) LinkedHashMap(int initialCapacity, float loadFactor,
  boolean accessOrder): 構建一個擁有特定容量、載入因子和訪問順序排序的空的連結雜湊映像
  “如果將accessOrder設定為true,那麼連結雜湊映像將使用訪問順序而不是插入順序來迭
  代各個映像。每次呼叫get或者put方法時,相關的對映便從它的當前位置上刪除,然後放到連結式映像列表的結尾處(只有連結式映像列表中的位置才會受到影響,雜湊表元則不受影響。雜湊表對映總是待在對應於關鍵字的雜湊碼的雜湊表元中)。”
  “該特性對於實現快取記憶體的“刪除最近最少使用”的原則很有用。例如,你可以希望將最常訪問的對映儲存在記憶體中,並且從資料庫中讀取不經常訪問的物件。當你在表中找不到某個對映,並且該表中的對映已經放得非常滿時,你可以讓迭代器進入該表,將它列舉的開頭幾個對映刪除掉。這些是最近最少使用的對映。”
  (6) protected boolean removeEldestEntry(Map.Entry eldest): 如果你想刪除最老的對映,則覆蓋該方法,以便返回true。當某個對映已經新增給映像之後,便呼叫該方法。它的預設實現方法返回false,表示預設條件下老的對映沒有被刪除。但是你可以重新定義本方法,以便有選擇地在最老的對映符合某個條件,或者映像超過了某個大小時,返回true。
  4.6. WeakHashMap類
  WeakHashMap是Map的一個特殊實現,它使用WeakReference(弱引用)來存放雜湊表關鍵字。使用這種方式時,當對映的鍵在 WeakHashMap 的外部不再被引用時,垃圾收集器會將它回收,但它將把到達該物件的弱引用納入一個佇列。WeakHashMap的執行將定期檢查該佇列,以便找出新到達的弱應用。當一個弱引用到達該佇列時,就表示關鍵字不再被任何人使用,並且它已經被收集起來。然後WeakHashMap便刪除相關的對映。
  (1) WeakHashMap(): 構建一個空弱雜湊映像
  (2) WeakHashMap(Map t): 構建一個弱雜湊映像,並且新增映像t中所有對映
  (3) WeakHashMap(int initialCapacity): 構建一個擁有特定容量的空的弱雜湊映像
  (4) WeakHashMap(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空的弱雜湊映像
  4.6. IdentityHashMap類
  IdentityHashMap也是Map的一個特殊實現。在這個類中,關鍵字的雜湊碼不應該由hashCode()方法來計算,而應該由System.identityHashCode方法進行計算(即使已經重新定義了hashCode方法)。這是Object.hashCode根據物件的記憶體地址來計算雜湊碼時使用的方法。另外,為了對各個物件進行比較,IdentityHashMap將使用==,而不使用equals方法。
  換句話說,不同的關鍵字物件,即使它們的內容相同,也被視為不同的物件。IdentityHashMap類可以用於實現物件拓撲結構轉換(topology-preserving object graph transformations)(比如實現物件的序列化或深度拷貝),在進行轉換時,需要一個“節點表”跟蹤那些已經處理過的物件的引用。即使碰巧有物件相等,“節點表”也不應視其相等。另一個應用是維護代理物件。比如,除錯工具希望在程式除錯期間維護每個物件的一個代理物件。
  “IdentityHashMap類不是一般意義的Map實現!它的實現有意的違背了Map介面要求通過equals方法比較物件的約定。這個類僅使用在很少發生的需要強調等同性語義的情況。”
  (1) IdentityHashMap (): 構建一個空的全同雜湊映像,預設預期最大尺寸為21
  “預期最大尺寸是映像期望把持的鍵/值對映的最大數目”
  (2) IdentityHashMap (Map m): 構建一個全同雜湊映像,並且新增映像m中所有對映
  (3) IdentityHashMap (int expectedMaxSize): 構建一個擁有預期最大尺寸的空的全同雜湊映像。放置超過預期最大尺寸的鍵/值對映時,將引起內部資料結構的增長,有時可能很費時