全面接觸Java集合框架_第1頁(yè)
全面接觸Java集合框架_第2頁(yè)
全面接觸Java集合框架_第3頁(yè)
全面接觸Java集合框架_第4頁(yè)
全面接觸Java集合框架_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java平臺(tái)提供了一個(gè)全新的集合框架?!凹峡蚣堋敝饕梢唤M用來(lái)操作對(duì)象的接口組成。不同接口描述一組不同數(shù)據(jù)類型。 Java 2集合框架圖 集合接口:6個(gè)接口(短虛線表示),表示不同集合類型,是集合框架的基礎(chǔ)。 抽象類:5個(gè)抽象類(長(zhǎng)虛線表示),對(duì)集合接口的部分實(shí)現(xiàn)??蓴U(kuò)展為自定義集合類。 實(shí)現(xiàn)類:8個(gè)實(shí)現(xiàn)類(實(shí)線表示),對(duì)接口的具體實(shí)現(xiàn)。 在很大程度上,一旦您理解了接口,您就理解了框架。雖然您總要?jiǎng)?chuàng)建接口特定的實(shí)現(xiàn),但訪問(wèn)實(shí)際集合的方法應(yīng)該限制在接口方法的使用上;因此,允許您更改基本的數(shù)據(jù)結(jié)構(gòu)而不必改變其它代碼。 · Collection 接口是一組允許重復(fù)的對(duì)象。 ·

2、Set 接口繼承 Collection,但不允許重復(fù),使用自己內(nèi)部的一個(gè)排列機(jī)制。 · List 接口繼承 Collection,允許重復(fù),以元素安插的次序來(lái)放置元素,不會(huì)重新排列。 · Map接口是一組成對(duì)的鍵值對(duì)象,即所持有的是key-value pairs。Map中不能有重復(fù)的key。擁有自己的內(nèi)部排列機(jī)制。 · 容器中的元素類型都為Object。從容器取得元素時(shí),必須把它轉(zhuǎn)換成原來(lái)的類型。 Java 2簡(jiǎn)化集合框架圖 集合接口 1.Collection 接口 用于表示任何對(duì)象或元素組。想要盡可能以常規(guī)方式處理一組元素時(shí),就使用這一接口。 (1) boole

3、an hasNext(): 判斷是否存在另一個(gè)可訪問(wèn)的元素 Object next(): 返回要訪問(wèn)的下一個(gè)元素。如果到達(dá)集合結(jié)尾,則拋出NoSuchElementException異常。 (2) void remove(): 刪除上次訪問(wèn)返回的對(duì)象。本方法必須緊跟在一個(gè)元素的訪問(wèn)后執(zhí)行。如果上次訪問(wèn)后集合已被修改,方法將拋出IllegalStateException。 “Iterator中刪除操作對(duì)底層Collection也有影響?!?迭代器是 故障快速修復(fù)(fail-fast)的。這意味著,當(dāng)另一個(gè)線程修改底層集合的時(shí)候,如果您正在用 Iterator 遍歷集合,那么,Iterator就會(huì)

4、拋出 ConcurrentModificationException (另一種 RuntimeException異常)異常并立刻失敗。 2.List接口 List 接口繼承了 Collection 接口以定義一個(gè)允許重復(fù)項(xiàng)的有序集合。該接口不但能夠?qū)α斜淼囊徊糠诌M(jìn)行處理,還添加了面向位置的操作。 . LinkedList類 LinkedList類添加了一些處理列表兩端元素的方法。 (1) int compareTo(Object o): 比較當(dāng)前實(shí)例對(duì)象與對(duì)象o,如果位于對(duì)象o之前,返回負(fù)值,如果兩個(gè)對(duì)象在排序中位置相同,則返回0,如果位于對(duì)象o后面,則返回正值 在 Java 2 SDK版本1

5、.4中有二十四個(gè)類實(shí)現(xiàn)Comparable接口。下表展示了8種基本類型的自然排序。雖然一些類共享同一種自然排序,但只有相互可比的類才能排序。 類 排序 BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short 按數(shù)字大小排序 Character 按 Unicode 值的數(shù)字大小排序 String 按字符串中字符 Unicode 值排序 類排序BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short 按數(shù)字大小排序Character 按 Unicode 值的數(shù)字大小排序

6、String 按字符串中字符 Unicode 值排序 利用Comparable接口創(chuàng)建您自己的類的排序順序,只是實(shí)現(xiàn)compareTo()方法的問(wèn)題。通常就是依賴幾個(gè)數(shù)據(jù)成員的自然排序。同時(shí)類也應(yīng)該覆蓋equals()和hashCode()以確保兩個(gè)相等的對(duì)象返回同一個(gè)哈希碼。 (1)int compare(Object o1, Object o2): 對(duì)兩個(gè)對(duì)象o1和o2進(jìn)行比較,如果o1位于o2的前面,則返回負(fù)值,如果在排序順序中認(rèn)為o1和o2是相同的,返回0,如果o1位于o2的后面,則返回正值 “與Comparable相似,0返回值不表示元素相等。一個(gè)0返回值只是表示兩個(gè)對(duì)象排在同一位置

7、。由Comparator用戶決定如何處理。如果兩個(gè)不相等的元素比較的結(jié)果為零,您首先應(yīng)該確信那就是您要的結(jié)果,然后記錄行為。” (2)boolean equals(Object obj): 指示對(duì)象obj是否和比較器相等。 “該方法覆寫Object的equals()方法,檢查的是Comparator實(shí)現(xiàn)的等同性,不是處于比較狀態(tài)下的對(duì)象。” 3.3. SortedSet接口 “集合框架”提供了個(gè)特殊的Set接口:SortedSet,它保持元素的有序順序。SortedSet接口為集的視圖(子集)和它的兩端(即頭和尾)提供了訪問(wèn)方法。當(dāng)您處理列表的子集時(shí),更改視圖會(huì)反映到源集。此外,更改源集也會(huì)反

8、映在子集上。發(fā)生這種情況的原因在于視圖由兩端的元素而不是下標(biāo)元素指定,所以如果您想要一個(gè)特殊的高端元素(toElement)在子集中,您必須找到下一個(gè)元素。 添加到SortedSet實(shí)現(xiàn)類的元素必須實(shí)現(xiàn)Comparable接口,否則您必須給它的構(gòu)造函數(shù)提供一個(gè)Comparator接口的實(shí)現(xiàn)。TreeSet類是它的唯一一份實(shí)現(xiàn)。 “因?yàn)榧仨毎ㄒ坏捻?xiàng),如果添加元素時(shí)比較兩個(gè)元素導(dǎo)致了0返回值(通過(guò)Comparable的compareTo()方法或Comparator的compare()方法),那么新元素就沒(méi)有添加進(jìn)去。如果兩個(gè)元素相等,那還好。但如果它們不相等的話,您接下來(lái)就應(yīng)該修改比較方法

9、,讓比較方法和 equals() 的效果一致?!?(1) Comparator comparator(): 返回對(duì)元素進(jìn)行排序時(shí)使用的比較器,如果使用Comparable接口的compareTo()方法對(duì)元素進(jìn)行比較,則返回null (2) Object first(): 返回有序集合中第一個(gè)(最低)元素 (3) Object last(): 返回有序集合中最后一個(gè)(最高)元素 (4) SortedSet subSet(Object fromElement, Object toElement): 返回從fromElement(包括)至toElement(不包括)范圍內(nèi)元素的SortedSet視

10、圖(子集) (5) SortedSet headSet(Object toElement): 返回SortedSet的一個(gè)視圖,其內(nèi)各元素皆小于toElement (6) SortedSet tailSet(Object fromElement): 返回SortedSet的一個(gè)視圖,其內(nèi)各元素皆大于或等于fromElement 3.4. AbstractSet抽象類 AbstractSet類覆蓋了Object類的equals()和hashCode()方法,以確保兩個(gè)相等的集返回相同的哈希碼。若兩個(gè)集大小相等且包含相同元素,則這兩個(gè)集相等。按定義,集的哈希碼是集中元素哈希碼的總和。因此,不論集的

11、內(nèi)部順序如何,兩個(gè)相等的集會(huì)有相同的哈希碼。 . Object類 (1) boolean equals(Object obj): 對(duì)兩個(gè)對(duì)象進(jìn)行比較,以便確定它們是否相同 (2) int hashCode(): 返回該對(duì)象的哈希碼。相同的對(duì)象必須返回相同的哈希碼 3.5. HashSet類類和TreeSet類 “集合框架”支持Set接口兩種普通的實(shí)現(xiàn):HashSet和TreeSet(TreeSet實(shí)現(xiàn)SortedSet接口)。在更多情況下,您會(huì)使用 HashSet 存儲(chǔ)重復(fù)自由的集合。考慮到效率,添加到 HashSet 的對(duì)象需要采用恰當(dāng)分配哈希碼的方式來(lái)實(shí)現(xiàn)hashCode()方法。雖然大多

12、數(shù)系統(tǒng)類覆蓋了 Object中缺省的hashCode()和equals()實(shí)現(xiàn),但創(chuàng)建您自己的要添加到HashSet的類時(shí),別忘了覆蓋 hashCode()和equals()。 當(dāng)您要從集合中以有序的方式插入和抽取元素時(shí),TreeSet實(shí)現(xiàn)會(huì)有用處。為了能順利進(jìn)行,添加到TreeSet的元素必須是可排序的。 (1) 添加、刪除操作: Object put(Object key, Object value): 將互相關(guān)聯(lián)的一個(gè)關(guān)鍵字與一個(gè)值放入該映像。如果該關(guān)鍵字已經(jīng)存在,那么與此關(guān)鍵字相關(guān)的新值將取代舊值。方法返回關(guān)鍵字的舊值,如果關(guān)鍵字原先并不存在,則返回null Object remove

13、(Object key): 從映像中刪除與key相關(guān)的映射 void putAll(Map t): 將來(lái)自特定映像的所有元素添加給該映像 void clear(): 從映像中刪除所有映射 “鍵和值都可以為null。但是,您不能把Map作為一個(gè)鍵或值添加給自身。” (2) 查詢操作: Object get(Object key): 獲得與關(guān)鍵字key相關(guān)的值,并且返回與關(guān)鍵字key相關(guān)的對(duì)象,如果沒(méi)有在該映像中找到該關(guān)鍵字,則返回null boolean containsKey(Object key): 判斷映像中是否存在關(guān)鍵字key boolean containsValue(Object v

14、alue): 判斷映像中是否存在值value int size(): 返回當(dāng)前映像中映射的數(shù)量 boolean isEmpty() :判斷映像中是否有任何映射 (3) 視圖操作 :處理映像中鍵/值對(duì)組 Set keySet(): 返回映像中所有關(guān)鍵字的視圖集 “因?yàn)橛成渲墟I的集合必須是唯一的,您用Set支持。你還可以從視圖中刪除元素,同時(shí),關(guān)鍵字和它相關(guān)的值將從源映像中被刪除,但是你不能添加任何元素?!?Collection values():返回映像中所有值的視圖集 “因?yàn)橛成渲兄档募喜皇俏ㄒ坏模肅ollection支持。你還可以從視圖中刪除元素,同時(shí),值和它的關(guān)鍵字將從源映像中被刪除

15、,但是你不能添加任何元素。” Set entrySet(): 返回Map.Entry對(duì)象的視圖集,即映像中的關(guān)鍵字/值對(duì) “因?yàn)橛成涫俏ㄒ坏?,您用Set支持。你還可以從視圖中刪除元素,同時(shí),這些元素將從源映像中被刪除,但是你不能添加任何元素?!?4.1. Map.Entry接口 Map的entrySet()方法返回一個(gè)實(shí)現(xiàn)Map.Entry接口的對(duì)象集合。集合中每個(gè)對(duì)象都是底層Map中一個(gè)特定的鍵/值對(duì)。 通過(guò)這個(gè)集合的迭代器,您可以獲得每一個(gè)條目(唯一獲取方式)的鍵或值并對(duì)值進(jìn)行更改。當(dāng)條目通過(guò)迭代器返回后,除非是迭代器自身的remove()方法或者迭代器返回的條目的setValue()方法

16、,其余對(duì)源Map外部的修改都會(huì)導(dǎo)致此條目集變得無(wú)效,同時(shí)產(chǎn)生條目行為未定義。 (1) Object getKey(): 返回條目的關(guān)鍵字 (2) Object getValue(): 返回條目的值 (3) Object setValue(Object value): 將相關(guān)映像中的值改為value,并且返回舊值 4.2. SortedMap接口 “集合框架”提供了個(gè)特殊的Map接口:SortedMap,它用來(lái)保持鍵的有序順序。 SortedMap接口為映像的視圖(子集),包括兩個(gè)端點(diǎn)提供了訪問(wèn)方法。除了排序是作用于映射的鍵以外,處理SortedMap和處理SortedSet一樣。 添加到Sor

17、tedMap實(shí)現(xiàn)類的元素必須實(shí)現(xiàn)Comparable接口,否則您必須給它的構(gòu)造函數(shù)提供一個(gè)Comparator接口的實(shí)現(xiàn)。TreeMap類是它的唯一一份實(shí)現(xiàn)。 “因?yàn)閷?duì)于映射來(lái)說(shuō),每個(gè)鍵只能對(duì)應(yīng)一個(gè)值,如果在添加一個(gè)鍵/值對(duì)時(shí)比較兩個(gè)鍵產(chǎn)生了0返回值(通過(guò)Comparable的compareTo()方法或通過(guò)Comparator的compare()方法),那么,原始鍵對(duì)應(yīng)值被新的值替代。如果兩個(gè)元素相等,那還好。但如果不相等,那么您就應(yīng)該修改比較方法,讓比較方法和 equals() 的效果一致?!?(1) Comparator comparator(): 返回對(duì)關(guān)鍵字進(jìn)行排序時(shí)使用的比較器,如

18、果使用Comparable接口的compareTo()方法對(duì)關(guān)鍵字進(jìn)行比較,則返回null (2) Object firstKey(): 返回映像中第一個(gè)(最低)關(guān)鍵字 (3) Object lastKey(): 返回映像中最后一個(gè)(最高)關(guān)鍵字 (4) SortedMap subMap(Object fromKey, Object toKey): 返回從fromKey(包括)至toKey(不包括)范圍內(nèi)元素的SortedMap視圖(子集) (5) SortedMap headMap(Object toKey): 返回SortedMap的一個(gè)視圖,其內(nèi)各元素的key皆小于toKey (6) S

19、ortedSet tailMap(Object fromKey): 返回SortedMap的一個(gè)視圖,其內(nèi)各元素的key皆大于或等于fromKey 4.3. AbstractMap抽象類 和其它抽象集合實(shí)現(xiàn)相似,AbstractMap 類覆蓋了equals()和hashCode()方法以確保兩個(gè)相等映射返回相同的哈希碼。如果兩個(gè)映射大小相等、包含同樣的鍵且每個(gè)鍵在這兩個(gè)映射中對(duì)應(yīng)的值都相同,則這兩個(gè)映射相等。映射的哈希碼是映射元素哈希碼的總和,其中每個(gè)元素是Map.Entry接口的一個(gè)實(shí)現(xiàn)。因此,不論映射內(nèi)部順序如何,兩個(gè)相等映射會(huì)報(bào)告相同的哈希碼。 4.4. HashMap類和TreeMap

20、類 “集合框架”提供兩種常規(guī)的Map實(shí)現(xiàn):HashMap和TreeMap (TreeMap實(shí)現(xiàn)SortedMap接口)。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會(huì)更好。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()的實(shí)現(xiàn)。 這個(gè)TreeMap沒(méi)有調(diào)優(yōu)選項(xiàng),因?yàn)樵摌淇偺幱谄胶鉅顟B(tài)。 . HashMap類 為了優(yōu)化HashMap空間的使用,您可以調(diào)優(yōu)初始容量和負(fù)載因子。 (1) HashMap(): 構(gòu)建一個(gè)空的哈希映像 (2) HashMap(Map m): 構(gòu)建一個(gè)哈希映像,并且

21、添加映像m的所有映射 (3) HashMap(int initialCapacity): 構(gòu)建一個(gè)擁有特定容量的空的哈希映像 (4) HashMap(int initialCapacity, float loadFactor): 構(gòu)建一個(gè)擁有特定容量和加載因子的空的哈希映像 . TreeMap類 TreeMap沒(méi)有調(diào)優(yōu)選項(xiàng),因?yàn)樵摌淇偺幱谄胶鉅顟B(tài)。 (1) TreeMap():構(gòu)建一個(gè)空的映像樹 (2) TreeMap(Map m): 構(gòu)建一個(gè)映像樹,并且添加映像m中所有元素 (3) TreeMap(Comparator c): 構(gòu)建一個(gè)映像樹,并且使用特定的比較器對(duì)關(guān)鍵字進(jìn)行排序 (4) T

22、reeMap(SortedMap s): 構(gòu)建一個(gè)映像樹,添加映像樹s中所有映射,并且使用與有序映像s相同的比較器排序 4.5. LinkedHashMap類 LinkedHashMap擴(kuò)展HashMap,以插入順序?qū)㈥P(guān)鍵字/值對(duì)添加進(jìn)鏈接哈希映像中。象LinkedHashSet一樣,LinkedHashMap內(nèi)部也采用雙重鏈接式列表。 (1) LinkedHashMap(): 構(gòu)建一個(gè)空鏈接哈希映像 (2) LinkedHashMap(Map m): 構(gòu)建一個(gè)鏈接哈希映像,并且添加映像m中所有映射 (3) LinkedHashMap(int initialCapacity): 構(gòu)建一個(gè)擁有特

23、定容量的空的鏈接哈希映像 (4) LinkedHashMap(int initialCapacity, float loadFactor): 構(gòu)建一個(gè)擁有特定容量和加載因子的空的鏈接哈希映像 (5) LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder): 構(gòu)建一個(gè)擁有特定容量、加載因子和訪問(wèn)順序排序的空的鏈接哈希映像 “如果將accessOrder設(shè)置為true,那么鏈接哈希映像將使用訪問(wèn)順序而不是插入順序來(lái)迭 代各個(gè)映像。每次調(diào)用get或者put方法時(shí),相關(guān)的映射便從它的當(dāng)前位置上刪除,然后放到鏈接

24、式映像列表的結(jié)尾處(只有鏈接式映像列表中的位置才會(huì)受到影響,哈希表元?jiǎng)t不受影響。哈希表映射總是待在對(duì)應(yīng)于關(guān)鍵字的哈希碼的哈希表元中)?!?“該特性對(duì)于實(shí)現(xiàn)高速緩存的“刪除最近最少使用”的原則很有用。例如,你可以希望將最常訪問(wèn)的映射保存在內(nèi)存中,并且從數(shù)據(jù)庫(kù)中讀取不經(jīng)常訪問(wèn)的對(duì)象。當(dāng)你在表中找不到某個(gè)映射,并且該表中的映射已經(jīng)放得非常滿時(shí),你可以讓迭代器進(jìn)入該表,將它枚舉的開頭幾個(gè)映射刪除掉。這些是最近最少使用的映射?!?(6) protected boolean removeEldestEntry(Map.Entry eldest): 如果你想刪除最老的映射,則覆蓋該方法,以便返回true。當(dāng)

25、某個(gè)映射已經(jīng)添加給映像之后,便調(diào)用該方法。它的默認(rèn)實(shí)現(xiàn)方法返回false,表示默認(rèn)條件下老的映射沒(méi)有被刪除。但是你可以重新定義本方法,以便有選擇地在最老的映射符合某個(gè)條件,或者映像超過(guò)了某個(gè)大小時(shí),返回true。 4.6. WeakHashMap類 WeakHashMap是Map的一個(gè)特殊實(shí)現(xiàn),它使用WeakReference(弱引用)來(lái)存放哈希表關(guān)鍵字。使用這種方式時(shí),當(dāng)映射的鍵在 WeakHashMap 的外部不再被引用時(shí),垃圾收集器會(huì)將它回收,但它將把到達(dá)該對(duì)象的弱引用納入一個(gè)隊(duì)列。WeakHashMap的運(yùn)行將定期檢查該隊(duì)列,以便找出新到達(dá)的弱應(yīng)用。當(dāng)一個(gè)弱引用到達(dá)該隊(duì)列時(shí),就表示關(guān)鍵字不再被任何人使用,并且它已經(jīng)被收集起來(lái)。然后WeakHashMap便刪除相關(guān)的映射。 (1) WeakHashMap(): 構(gòu)建一個(gè)空弱哈希映像 (2) WeakHashMap(Map t): 構(gòu)建一個(gè)弱哈希映像,并且添加映像t中所有映射 (3) WeakHashMap(int initialCapacity): 構(gòu)建一個(gè)擁有特定容量的空的弱哈希映像 (4) Weak

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論