Collection 接口是一組允許重復的對象
· Set 接口繼承 Collection但不允許重復使用自己內部的一個排列機制
· List 接口繼承 Collection允許重復以元素安插的次序來放置元素不會重新排列
· Map接口是一組成對的鍵-值對象即所持有的是keyvalue pairsMap中不能有重復的key擁有自己的內部排列機制
· 容器中的元素類型都為Object從容器取得元素時必須把它轉換成原來的類型
集合接口
Collection 接口
用於表示任何對象或元素組想要盡可能以常規方式處理一組元素時就使用這一接口
() 單元素添加刪除操作
boolean add(Object o):將對象添加給集合
boolean remove(Object o): 如果集合中有與o相匹配的對象則刪除對象o
() 查詢操作
int size() 返回當前集合中元素的數量
boolean isEmpty() 判斷集合中是否有任何元素
boolean contains(Object o) 查找集合中是否含有對象o
Iterator iterator() 返回一個迭代器用來訪問集合中的各個元素
() 組操作 作用於元素組或整個集合
boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素
boolean addAll(Collection c) : 將集合c 中所有元素添加給該集合
void clear(): 刪除集合中所有元素
void removeAll(Collection c) : 從集合中刪除集合c 中的所有元素
void retainAll(Collection c) : 從集合中刪除集合c 中不包含的元素
() Collection轉換為Object數組
Object[] toArray() 返回一個內含集合所有元素的array
Object[] toArray(Object[] a) 返回一個內含集合所有元素的array運行期返回的array和參數a的型別相同需要轉換為正確型別
此外您還可以把集合轉換成其它任何其它的對象數組但是您不能直接把集合轉換成基本數據類型的數組因為集合必須持有對象
斜體接口方法是可選的因為一個接口實現必須實現所有接口方法調用程序就需要一種途徑來知道一個可選的方法是不是不受支持如果調用一種可選方法時一個 UnsupportedOperationException 被拋出則操作失敗因為方法不受支持此異常類繼承 RuntimeException 類避免了將所有集合操作放入 trycatch 塊
Collection不提供get()方法如果要遍歷Collectin中的元素就必須用Iterator
AbstractCollection 抽象類
AbstractCollection 類提供具體集合框架類的基本功能雖然您可以自行實現 Collection 接口的所有方法但是除了iterator()和size()方法在恰當的子類中實現以外其它所有方法都由 AbstractCollection 類來提供實現如果子類不覆蓋某些方法可選的如add()之類的方法將拋出異常
Iterator 接口
Collection 接口的iterator()方法返回一個 IteratorIterator接口方法能以迭代方式逐個訪問集合中各個元素並安全的從Collection 中除去適當的元素
() boolean hasNext(): 判斷是否存在另一個可訪問的元素
Object next(): 返回要訪問的下一個元素如果到達集合結尾則拋出NoSuchElementException異常
() void remove(): 刪除上次訪問返回的對象本方法必須緊跟在一個元素的訪問後執行如果上次訪問後集合已被修改方法將拋出IllegalStateException
Iterator中刪除操作對底層Collection也有影響
迭代器是 故障快速修復(failfast)的這意味著當另一個線程修改底層集合的時候如果您正在用 Iterator 遍歷集合那麼Iterator就會拋出 ConcurrentModificationException (另一種 RuntimeException異常)異常並立刻失敗
List接口
List 接口繼承了 Collection 接口以定義一個允許重復項的有序集合該接口不但能夠對列表的一部分進行處理還添加了面向位置的操作
() 面向位置的操作包括插入某個元素或 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的位置否則返回
int lastIndexOf(Object o) 返回最後一個出現元素o的位置否則返回
Object remove(int index) 刪除指定位置上的元素
Object set(int index Object element) 用元素element取代位置index上的元素並且返回舊的元素
() List 接口不但以位置序列迭代的遍歷整個列表還能處理集合的子集
ListIterator listIterator() : 返回一個列表迭代器用來訪問列表中的元素
ListIterator listIterator(int index) : 返回一個列表迭代器用來從指定位置index開始訪問列表中的元素
List subList(int fromIndex int toIndex) 返回從指定位置fromIndex(包含)到toIndex(不包含)范圍中各個元素的列表視圖
對子列表的更改(如 add()remove() 和 set() 調用)對底層 List 也有影響
ListIterator接口
ListIterator 接口繼承 Iterator 接口以支持添加或更改底層集合中的元素還支持雙向訪問ListIterator沒有當前位置光標位於調用previous和next方法返回的值之間一個長度為n的列表有n+個有效索引值
() void add(Object o): 將對象o添加到當前位置的前面
void set(Object o): 用對象o替代next或previous方法訪問的上一個元素如果上次調用後列表結構被修改了那麼將拋出IllegalStateException異常
() boolean hasPrevious(): 判斷向後迭代時是否有元素可訪問
Object previous()返回上一個對象
int nextIndex(): 返回下次調用next方法時將返回的元素的索引
int previousIndex(): 返回下次調用previous方法時將返回的元素的索引
正常情況下不用ListIterator改變某次遍歷集合元素的方向 — 向前或者向後雖然在技術上可以實現但previous() 後立刻調用next()返回的是同一個元素把調用 next()和previous()的順序顛倒一下結果相同
我們還需要稍微再解釋一下 add() 操作添加一個元素會導致新元素立刻被添加到隱式光標的前面因此添加元素後調用 previous() 會返回新元素而調用 next() 則不起作用返回添加操作之前的下一個元素
AbstractList和AbstractSequentialList抽象類
有兩個抽象的 List 實現類AbstractList 和 AbstractSequentialList像 AbstractSet 類一樣它們覆蓋了 equals() 和 hashCode() 方法以確保兩個相等的集合返回相同的哈希碼若兩個列表大小相等且包含順序相同的相同元素則這兩個列表相等這裡的 hashCode() 實現在 List 接口定義中指定而在這裡實現
除了equals()和hashCode()AbstractList和AbstractSequentialList實現了其余 List 方法的一部分因為數據的隨機訪問和順序訪問是分別實現的使得具體列表實現的創建更為容易需要定義的一套方法取決於您希望支持的行為您永遠不必親自提供的是 iterator方法的實現
LinkedList類和ArrayList類
在集合框架中有兩種常規的 List 實現ArrayList 和 LinkedList使用兩種 List 實現的哪一種取決於您特定的需要如果要支持隨機訪問而不必在除尾部的任何位置插入或除去元素那麼ArrayList 提供了可選的集合但如果您要頻繁的從列表的中間位置添加和除去元素而只要順序的訪問列表元素那麼LinkedList 實現更好
ArrayList 和 LinkedList 都實現 Cloneable 接口都提供了兩個構造函數一個無參的一個接受另一個Collection
LinkedList類
LinkedList類添加了一些處理列表兩端元素的方法
() void addFirst(Object o): 將對象o添加到列表的開頭
void addLast(Object o)將對象o添加到列表的結尾
() Object getFirst(): 返回列表開頭的元素
Object getLast(): 返回列表結尾的元素
() Object removeFirst(): 刪除並且返回列表開頭的元素
Object removeLast():刪除並且返回列表結尾的元素
() LinkedList(): 構建一個空的鏈接列表
LinkedList(Collection c): 構建一個鏈接列表並且添加集合c的所有元素
使用這些新方法您就可以輕松的把 LinkedList 當作一個堆棧隊列或其它面向端點的數據結構
ArrayList類
ArrayList類封裝了一個動態再分配的Object[]數組每個ArrayList對象有一個capacity這個capacity表示存儲列表中元素的數組的容量當元素添加到ArrayList時它的capacity在常量時間內自動增加
在向一個ArrayList對象添加大量元素的程序中可使用ensureCapacity方法增加capacity這可以減少增加重分配的數量
() void ensureCapacity(int minCapacity): 將ArrayList對象容量增加minCapacity
() void trimToSize(): 整理ArrayList對象容量為列表當前大小程序可使用這個操作減少ArrayList對象存儲空間
RandomAccess接口
一個特征接口該接口沒有任何方法不過你可以使用該接口來測試某個集合是否支持有效的隨機訪問ArrayList和Vector類用於實現該接口
Set接口
Set 接口繼承 Collection 接口而且它不允許集合中存在重復項每個具體的 Set 實現類依賴添加的對象的 equals()方法來檢查獨一性Set接口沒有引入新方法所以Set就是一個Collection只不過其行為不同
Hash表
Hash表是一種數據結構用來查找對象Hash表為每個對象計算出一個整數稱為Hash Code(哈希碼)Hash表是個鏈接式列表的陣列每個列表稱為一個buckets(哈希表元)對象位置的計算 index = HashCode % buckets (HashCode為對象哈希碼buckets為哈希表元總數)
當你添加元素時有時你會遇到已經填充了元素的哈希表元這種情況稱為Hash Collisions(哈希沖突)這時你必須判斷該元素是否已經存在於該哈希表中
如果哈希碼是合理地隨機分布的並且哈希表元的數量足夠大那麼哈希沖突的數量就會減少同時你也可以通過設定一個初始的哈希表元數量來更好地控制哈希表的運行初始哈希表元的數量為 buckets = size * % + (size為預期元素的數量)
如果哈希表中的元素放得太滿就必須進行rehashing(再哈希)再哈希使哈希表元數增倍並將原有的對象重新導入新的哈希表元中而原始的哈希表元被刪除load factor(加載因子)決定何時要對哈希表進行再哈希在Java編程語言中加載因子默認值為默認哈希表元為
Comparable接口和Comparator接口
在集合框架中有兩種比較接口Comparable接口和Comparator接口像String和Integer等Java內建類實現Comparable接口以提供一定排序方式但這樣只能實現該接口一次對於那些沒有實現Comparable接口的類或者自定義的類您可以通過Comparator接口來定義您自己的比較方式
Comparable接口
在javalang包中Comparable接口適用於一個類有自然順序的時候假定對象集合是同一類型該接口允許您把集合排序成自然順序
() int compareTo(Object o): 比較當前實例對象與對象o如果位於對象o之前返回負值如果兩個對象在排序中位置相同則返回如果位於對象o後面則返回正值
在 Java SDK版本中有二十四個類實現Comparable接口下表展示了種基本類型的自然排序雖然一些類共享同一種自然排序但只有相互可比的類才能排序
利用Comparable接口創建您自己的類的排序順序只是實現compareTo()方法的問題通常就是依賴幾個數據成員的自然排序同時類也應該覆蓋equals()和hashCode()以確保兩個相等的對象返回同一個哈希碼
Comparator接口
若一個類不能用於實現javalangComparable或者您不喜歡缺省的Comparable行為並想提供自己的排序順序(可能多種排序方式)你可以實現Comparator接口從而定義一個比較器
()int compare(Object o Object o): 對兩個對象o和o進行比較如果o位於o的前面則返回負值如果在排序順序中認為o和o是相同的返回如果o位於o的後面則返回正值
與Comparable相似返回值不表示元素相等一個返回值只是表示兩個對象排在同一位置由Comparator用戶決定如何處理如果兩個不相等的元素比較的結果為零您首先應該確信那就是您要的結果然後記錄行為
()boolean equals(Object obj): 指示對象obj是否和比較器相等
該方法覆寫Object的equals()方法檢查的是Comparator實現的等同性不是處於比較狀態下的對象
SortedSet接口
集合框架提供了個特殊的Set接口SortedSet它保持元素的有序順序SortedSet接口為集的視圖(子集)和它的兩端(即頭和尾)提供了訪問方法當您處理列表的子集時更改視圖會反映到源集此外更改源集也會反映在子集上發生這種情況的原因在於視圖由兩端的元素而不是下標元素指定所以如果您想要一個特殊的高端元素(toElement)在子集中您必須找到下一個元素
添加到SortedSet實現類的元素必須實現Comparable接口否則您必須給它的構造函數提供一個Comparator接口的實現TreeSet類是它的唯一一份實現
因為集必須包含唯一的項如果添加元素時比較兩個元素導致了返回值(通過Comparable的compareTo()方法或Comparator的compare()方法)那麼新元素就沒有添加進去如果兩個元素相等那還好但如果它們不相等的話您接下來就應該修改比較方法讓比較方法和 equals() 的效果一致
() Comparator comparator(): 返回對元素進行排序時使用的比較器如果使用Comparable接口的compareTo()方法對元素進行比較則返回null
() Object first(): 返回有序集合中第一個(最低)元素
() Object last(): 返回有序集合中最後一個(最高)元素
() SortedSet subSet(Object fromElement Object toElement): 返回從fromElement(包括)至toElement(不包括)范圍內元素的SortedSet視圖(子集)
() SortedSet headSet(Object toElement): 返回SortedSet的一個視圖其內各元素皆小於toElement
() SortedSet tailSet(Object fromElement): 返回SortedSet的一個視圖其內各元素皆大於或等於fromElement
AbstractSet抽象類
AbstractSet類覆蓋了Object類的equals()和hashCode()方法以確保兩個相等的集返回相同的哈希碼若兩個集大小相等且包含相同元素則這兩個集相等按定義集的哈希碼是集中元素哈希碼的總和因此不論集的內部順序如何兩個相等的集會有相同的哈希碼
Object類
() boolean equals(Object obj): 對兩個對象進行比較以便確定它們是否相同
() int hashCode(): 返回該對象的哈希碼相同的對象必須返回相同的哈希碼
HashSet類和TreeSet類
集合框架支持Set接口兩種普通的實現HashSet和TreeSet(TreeSet實現SortedSet接口)在更多情況下您會使用 HashSet 存儲重復自由的集合考慮到效率添加到 HashSet 的對象需要采用恰當分配哈希碼的方式來實現hashCode()方法雖然大多數系統類覆蓋了 Object中缺省的hashCode()和equals()實現但創建您自己的要添加到HashSet的類時別忘了覆蓋 hashCode()和equals()
當您要從集合中以有序的方式插入和抽取元素時TreeSet實現會有用處為了能順利進行添加到TreeSet的元素必須是可排序的
HashSet類
() HashSet(): 構建一個空的哈希集
() HashSet(Collection c): 構建一個哈希集並且添加集合c中所有元素
() HashSet(int initialCapacity): 構建一個擁有特定容量的空哈希集
() HashSet(int initialCapacity float loadFactor): 構建一個擁有特定容量和加載因子的空哈希集LoadFactor是至之間的一個數
TreeSet類
() TreeSet():構建一個空的樹集
() TreeSet(Collection c): 構建一個樹集並且添加集合c中所有元素
() TreeSet(Comparator c): 構建一個樹集並且使用特定的比較器對其元素進行排序
comparator比較器沒有任何數據它只是比較方法的存放器這種對象有時稱為函數對象函數對象通常在運行過程中被定義為匿名內部類的一個實例
TreeSet(SortedSet s): 構建一個樹集添加有序集合s中所有元素並且使用與有序集合s相同的比較器排序
LinkedHashSet類
LinkedHashSet擴展HashSet如果想跟蹤添加給HashSet的元素的順序LinkedHashSet實現會有幫助LinkedHashSet的迭代器按照元素的插入順序來訪問各個元素它提供了一個可以快速訪問各個元素的有序集合同時它也增加了實現的代價因為哈希表元中的各個元素是通過雙重鏈接式列表鏈接在一起的
() LinkedHashSet(): 構建一個空的鏈接式哈希集
() LinkedHashSet(Collection c): 構建一個鏈接式哈希集並且添加集合c中所有元素
() LinkedHashSet(int initialCapacity): 構建一個擁有特定容量的空鏈接式哈希集
() LinkedHashSet(int initialCapacity float loadFactor): 構建一個擁有特定容量和加載因子的空鏈接式哈希集LoadFactor是至之間的一個數
為優化HashSet空間的使用您可以調優初始容量和負載因子TreeSet不包含調優選項因為樹總是平衡的
Map接口
Map接口不是Collection接口的繼承Map接口用於維護鍵/值對(key/value pairs)該接口描述了從不重復的鍵到值的映射
() 添加刪除操作
Object put(Object key Object value): 將互相關聯的一個關鍵字與一個值放入該映像如果該關鍵字已經存在那麼與此關鍵字相關的新值將取代舊值方法返回關鍵字的舊值如果關鍵字原先並不存在則返回null
Object remove(Object key): 從映像中刪除與key相關的映射
void putAll(Map t): 將來自特定映像的所有元素添加給該映像
void clear(): 從映像中刪除所有映射
鍵和值都可以為null但是您不能把Map作為一個鍵或值添加給自身
() 查詢操作
Object get(Object key): 獲得與關鍵字key相關的值並且返回與關鍵字key相關的對象如果沒有在該映像中找到該關鍵字則返回null
boolean containsKey(Object key): 判斷映像中是否存在關鍵字key
boolean containsValue(Object value): 判斷映像中是否存在值value
int size(): 返回當前映像中映射的數量
boolean isEmpty() 判斷映像中是否有任何映射
() 視圖操作 處理映像中鍵/值對組
Set keySet(): 返回映像中所有關鍵字的視圖集
因為映射中鍵的集合必須是唯一的您用Set支持你還可以從視圖中刪除元素同時關鍵字和它相關的值將從源映像中被刪除但是你不能添加任何元素
Collection values():返回映像中所有值的視圖集
因為映射中值的集合不是唯一的您用Collection支持你還可以從視圖中刪除元素同時值和它的關鍵字將從源映像中被刪除但是你不能添加任何元素
Set entrySet(): 返回MapEntry對象的視圖集即映像中的關鍵字/值對
因為映射是唯一的您用Set支持你還可以從視圖中刪除元素同時這些元素將從源映像中被刪除但是你不能添加任何元素
MapEntry接口
Map的entrySet()方法返回一個實現MapEntry接口的對象集合集合中每個對象都是底層Map中一個特定的鍵/值對
通過這個集合的迭代器您可以獲得每一個條目(唯一獲取方式)的鍵或值並對值進行更改當條目通過迭代器返回後除非是迭代器自身的remove()方法或者迭代器返回的條目的setValue()方法其余對源Map外部的修改都會導致此條目集變得無效同時產生條目行為未定義
() Object getKey(): 返回條目的關鍵字
() Object getValue(): 返回條目的值
() Object setValue(Object value): 將相關映像中的值改為value並且返回舊值
SortedMap接口
集合框架提供了個特殊的Map接口SortedMap它用來保持鍵的有序順序
SortedMap接口為映像的視圖(子集)包括兩個端點提供了訪問方法除了排序是作用於映射的鍵以外處理SortedMap和處理SortedSet一樣
添加到SortedMap實現類的元素必須實現Comparable接口否則您必須給它的構造函數提供一個Comparator接口的實現TreeMap類是它的唯一一份實現
因為對於映射來說每個鍵只能對應一個值如果在添加一個鍵/值對時比較兩個鍵產生了返回值(通過Comparable的compareTo()方法或通過Comparator的compare()方法)那麼原始鍵對應值被新的值替代如果兩個元素相等那還好但如果不相等那麼您就應該修改比較方法讓比較方法和 equals() 的效果一致
() Comparator comparator(): 返回對關鍵字進行排序時使用的比較器如果使用Comparable接口的compareTo()方法對關鍵字進行比較則返回null
() Object firstKey(): 返回映像中第一個(最低)關鍵字
() Object lastKey(): 返回映像中最後一個(最高)關鍵字
() SortedMap subMap(Object fromKey Object toKey): 返回從fromKey(包括)至toKey(不包括)范圍內元素的SortedMap視圖(子集)
() SortedMap headMap(Object toKey): 返回SortedMap的一個視圖其內各元素的key皆小於toKey
() SortedSet tailMap(Object fromKey): 返回SortedMap的一個視圖其內各元素的key皆大於或等於fromKey
AbstractMap抽象類
和其它抽象集合實現相似AbstractMap 類覆蓋了equals()和hashCode()方法以確保兩個相等映射返回相同的哈希碼如果兩個映射大小相等包含同樣的鍵且每個鍵在這兩個映射中對應的值都相同則這兩個映射相等映射的哈希碼是映射元素哈希碼的總和其中每個元素是MapEntry接口的一個實現因此不論映射內部順序如何兩個相等映射會報告相同的哈希碼
HashMap類和TreeMap類
集合框架提供兩種常規的Map實現HashMap和TreeMap (TreeMap實現SortedMap接口)在Map 中插入刪除和定位元素HashMap 是最好的選擇但如果您要按自然順序或自定義順序遍歷鍵那麼TreeMap會更好使用HashMap要求添加的鍵類明確定義了hashCode()和equals()的實現
這個TreeMap沒有調優選項因為該樹總處於平衡狀態
HashMap類
為了優化HashMap空間的使用您可以調優初始容量和負載因子
() HashMap(): 構建一個空的哈希映像
() HashMap(Map m): 構建一個哈希映像並且添加映像m的所有映射
() HashMap(int initialCapacity): 構建一個擁有特定容量的空的哈希映像
() HashMap(int initialCapacity float loadFactor): 構建一個擁有特定容量和加載因子的空的哈希映像
TreeMap類
TreeMap沒有調優選項因為該樹總處於平衡狀態
() TreeMap():構建一個空的映像樹
() TreeMap(Map m): 構建一個映像樹並且添加映像m中所有元素
() TreeMap(Comparator c): 構建一個映像樹並且使用特定的比較器對關鍵字進行排序
() TreeMap(SortedMap s): 構建一個映像樹添加映像樹s中所有映射並且使用與有序映像s相同的比較器排序
LinkedHashMap類
LinkedHashMap擴展HashMap以插入順序將關鍵字/值對添加進鏈接哈希映像中象LinkedHashSet一樣LinkedHashMap內部也采用雙重鏈接式列表
() LinkedHashMap(): 構建一個空鏈接哈希映像
() LinkedHashMap(Map m): 構建一個鏈接哈希映像並且添加映像m中所有映射
() LinkedHashMap(int initialCapacity): 構建一個擁有特定容量的空的鏈接哈希映像
() LinkedHashMap(int initialCapacity float loadFactor): 構建一個擁有特定容量和加載因子的空的鏈接哈希映像
() LinkedHashMap(int initialCapacity float loadFactor
boolean accessOrder): 構建一個擁有特定容量加載因子和訪問順序排序的空的鏈接哈希映像
如果將accessOrder設置為true那麼鏈接哈希映像將使用訪問順序而不是插入順序來迭
代各個映像每次調用get或者put方法時相關的映射便從它的當前位置上刪除然後放到鏈接式映像列表的結尾處(只有鏈接式映像列表中的位置才會受到影響哈希表元則不受影響哈希表映射總是待在對應於關鍵字的哈希碼的哈希表元中)
該特性對於實現高速緩存的刪除最近最少使用的原則很有用例如你可以希望將最常訪問的映射保存在內存中並且從數據庫中讀取不經常訪問的對象當你在表中找不到某個映射並且該表中的映射已經放得非常滿時你可以讓迭代器進入該表將它枚舉的開頭幾個映射刪除掉這些是最近最少使用的映射
() protected boolean removeEldestEntry(MapEntry eldest): 如果你想刪除最老的映射則覆蓋該方法以便返回true當某個映射已經添加給映像之後便調用該方法它的默認實現方法返回false表示默認條件下老的映射沒有被刪除但是你可以重新定義本方法以便有選擇地在最老的映射符合某個條件或者映像超過了某個大小時返回true
WeakHashMap類
WeakHashMap是Map的一個特殊實現它使用WeakReference(弱引用)來存放哈希表關鍵字使用這種方式時當映射的鍵在 WeakHashMap 的外部不再被引用時垃圾收集器會將它回收但它將把到達該對象的弱引用納入一個隊列WeakHashMap的運行將定期檢查該隊列以便找出新到達的弱應用當一個弱引用到達該隊列時就表示關鍵字不再被任何人使用並且它已經被收集起來然後WeakHashMap便刪除相關的映射
() WeakHashMap(): 構建一個空弱哈希映像
() WeakHashMap(Map t): 構建一個弱哈希映像並且添加映像t中所有映射
() WeakHashMap(int initialCapacity): 構建一個擁有特定容量的空的弱哈希映像
() WeakHashMap(int initialCapacity float loadFactor): 構建一個擁有特定容量和加載因子的空的弱哈希映像
IdentityHashMap類
IdentityHashMap也是Map的一個特殊實現在這個類中關鍵字的哈希碼不應該由hashCode()方法來計算而應該由SystemidentityHashCode方法進行計算(即使已經重新定義了hashCode方法)這是ObjecthashCode根據對象的內存地址來計算哈希碼時使用的方法另外為了對各個對象進行比較IdentityHashMap將使用==而不使用equals方法
換句話說不同的關鍵字對象即使它們的內容相同也被視為不同的對象IdentityHashMap類可以用於實現對象拓撲結構轉換(topologypreserving object graph transformations)(比如實現對象的串行化或深度拷貝)在進行轉換時需要一個節點表跟蹤那些已經處理過的對象的引用即使碰巧有對象相等節點表也不應視其相等另一個應用是維護代理對象比如調試工具希望在程序調試期間維護每個對象的一個代理對象
IdentityHashMap類不是一般意義的Map實現!它的實現有意的違背了Map接口要求通過equals方法比較對象的約定這個類僅使用在很少發生的需要強調等同性語義的情況
() IdentityHashMap (): 構建一個空的全同哈希映像默認預期最大尺寸為
預期最大尺寸是映像期望把持的鍵/值映射的最大數目
() IdentityHashMap (Map m): 構建一個全同哈希映像並且添加映像m中所有映射
() IdentityHashMap (int expectedMaxSize): 構建一個擁有預期最大尺寸的空的全同哈希映像放置超過預期最大尺寸的鍵/值映射時將引起內部數據結構的增長有時可能很費時
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26195.html