亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

java集合框架圖

系統 1990 0
java集合框架圖
2009-03-09 13:35

簡化圖:

Java平臺提供了一個全新的集合框架。“集合框架”主要由一組用來操作對象的接口組成。不同接口描述一組不同數據類型。


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相匹配的對象,則刪除對象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類添加了一些處理列表兩端元素的方法。



(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 值排序

利用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): 構建一個擁有預期最大尺寸的空的全同哈希映像。放置超過預期最大尺寸的鍵/值映射時,將引起內部數據結構的增長,有時可能很費時

?

java集合框架圖


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 人人爱操 | 九九99热久久精品在线6手机 | 天天在线天天综合网色 | 奇米综合 | 在线一区播放 | 深夜日韩 | 欧美午夜性刺激在线观看免费 | 老子影院午夜精品欧美视频 | 中文字幕在线激情日韩一区 | 国产精品社区 | 深夜福利在线免费观看 | 久久在线一区 | 日韩精品中文字幕久久 | 久久这里 | 青青在线精品视频 | 天天摸天天干天天操 | 国产成+人+综合+亚洲 欧美 | 夜色综合| 黄黄网站| 日韩 亚洲 欧美 中文 高清 | 中文字幕在线高清 | 色涩在线| 99久久综合精品免费 | 日韩中文字幕在线观看视频 | 国产精品一区二区久久沈樵 | 欧美视频在线一区 | 日韩精品视频一区二区三区 | 日韩中文字幕免费在线观看 | 国产精品视频公开费视频 | 2021天天干| 久久99国产精品成人 | 日韩一级精品视频在线观看 | 黑丝毛片| 日本伊人色| 综合亚洲一区二区三区 | 在线视频日韩精品 | 狼人综合伊人 | 欧美色欧美亚洲高清在线观看 | 日本欧美大片 | 全部免费国产潢色一级 | 欧美特黄级乱色毛片 |