《Java實(shí)用程序設(shè)計(jì)(西電版)第5章容器類》由會(huì)員分享,可在線閱讀,更多相關(guān)《Java實(shí)用程序設(shè)計(jì)(西電版)第5章容器類(52頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、1 第 5 章 容 器 類第 5 章 容 器 類5.1 容器的概念與相互關(guān)系5.2 Set接口及其實(shí)現(xiàn)5.3 List接口及其實(shí)現(xiàn)5.4 Queue接口及其實(shí)現(xiàn)5.5 Map接口及其實(shí)現(xiàn)5.6 迭代器5.7 容器類的高級(jí)話題 2 第 5 章 容 器 類 5.1 容 器 的 概 念 與 相 互 關(guān) 系Java容器類的對(duì)象實(shí)例又稱為容器,容器用于保存對(duì)象。根據(jù)所存儲(chǔ)的元素的形式,可將容器按照接口不同劃分為兩大類:(1) Collection:一個(gè)由一系列元素組成的序列,其中的元素是指向其他對(duì)象的引用。 (2) Map:一個(gè)由一系列“鍵值對(duì)”組成的序列,允許通過鍵查找值。 3 第 5 章 容 器 類
2、 圖5-1 容器層次的簡(jiǎn)要結(jié)構(gòu) 4 第 5 章 容 器 類 5 第 5 章 容 器 類 6 第 5 章 容 器 類 7 第 5 章 容 器 類 5.2 Set接 口 及 其 實(shí) 現(xiàn)Set不接受重復(fù)的元素。Java SE中提供3種Set容器的實(shí)現(xiàn):HashSet、TreeSet和LinkedHashSet。HashSet類采用Hash表實(shí)現(xiàn)Set接口,它的查詢速度最快,但其中的元素沒有固定順序;TreeSet類采用紅黑樹結(jié)構(gòu)實(shí)現(xiàn)了SortedSet接口,能夠保證元素處于排序狀態(tài);LinkedHashSet類采用Hash表與鏈表結(jié)合的方式實(shí)現(xiàn)Set接口,它能夠以插入順序保存元素。 8 第 5 章
3、容 器 類 9 第 5 章 容 器 類 10 第 5 章 容 器 類 11 第 5 章 容 器 類 12 第 5 章 容 器 類 5.3 List接 口 及 其 實(shí) 現(xiàn)與數(shù)組類似地,List也可以建立數(shù)字索引與具體對(duì)象的關(guān)聯(lián),區(qū)別在于List可以自動(dòng)擴(kuò)充容量。Java SE中有兩種類型的List:ArrayList和LinkedList。 13 第 5 章 容 器 類 14 第 5 章 容 器 類 15 第 5 章 容 器 類 16 第 5 章 容 器 類 17 第 5 章 容 器 類 18 第 5 章 容 器 類 19 第 5 章 容 器 類 5.4 Queue接 口 及 其 實(shí) 現(xiàn)Queu
4、e是一種先進(jìn)先出(FIFO)的容器。程序從Queue的一端放入對(duì)象,從另一端取出對(duì)象,對(duì)象進(jìn)入和取出的順序是相同的。在Java SE中,LinkedList實(shí)現(xiàn)了Queue接口,因此LinkedList可以用作Queue的一種實(shí)現(xiàn)。 20 第 5 章 容 器 類 21 第 5 章 容 器 類 22 第 5 章 容 器 類 23 第 5 章 容 器 類 24 第 5 章 容 器 類 25 第 5 章 容 器 類 5.5 Map接 口 及 其 實(shí) 現(xiàn)Map是一系列“鍵-值”之間的映射關(guān)系,是一種將對(duì)象(而非數(shù)字)與對(duì)象相關(guān)聯(lián)的設(shè)計(jì)。在很多情況下,這一設(shè)計(jì)都能夠有效地解決問題,例如,當(dāng)我們需要統(tǒng)計(jì)一
5、篇論文中的各個(gè)英文單詞的個(gè)數(shù)時(shí),可創(chuàng)建一個(gè)由String映射到Integer的Map。Map的值可以是復(fù)雜的結(jié)構(gòu),例如,當(dāng)希望將一個(gè)科學(xué)家與其發(fā)表的論文列表建立映射時(shí),可以建立一個(gè)MapScientist,List。 26 第 5 章 容 器 類 27 第 5 章 容 器 類 28 第 5 章 容 器 類 29 第 5 章 容 器 類 30 第 5 章 容 器 類 5.6 迭 代 器List容器可以通過索引對(duì)其中的元素進(jìn)行訪問,Queue可以通過具體方法對(duì)隊(duì)首的元素進(jìn)行訪問。對(duì)于不同類型的容器,遍歷和操作的方式是不同的。但是在有些時(shí)候,需要應(yīng)對(duì)這樣的情況,對(duì)于不同類型的容器,我們希望能夠通過同
6、樣的方式執(zhí)行訪問,這樣就不需要根據(jù)不同的容器類型進(jìn)行不同的編碼。容器的迭代器(Iterator)針對(duì)這一需求給出了解決方法。 31 第 5 章 容 器 類迭代器具有如下特征:(1) 迭代器只能單向移動(dòng);(2) 使用容器的iterator()方法返回容器的迭代器,迭代器準(zhǔn)備返回容器的第一個(gè)元素;(3) 使用next()方法獲得序列的下一個(gè)元素;(4) 使用hasNext()方法檢查序列中是否還有元素;(5) 使用remove()將迭代器新近返回的元素(即由next()產(chǎn)生的最后一個(gè)元素)刪除,因此在調(diào)用remove()之前必須先調(diào)用next()。 32 第 5 章 容 器 類 33 第 5 章
7、容 器 類 34 第 5 章 容 器 類ListIterator是Iterator的子類型,它只能用于各類List容器的訪問。通過List接口的listIterator方法能夠返回用于List容器的ListIterator。與一般迭代器相比,ListIterator的功能更全面,除了具有Iterator接口所規(guī)定的行為特征以外,它還具有如下特征:(1) 使用hasPrevious()方法檢查序列中是否有前一個(gè)元素;(2) 使用nextIndex()方法返回下一次next()方法調(diào)用將要返回的元素的索引;(3) 使用previous()方法返回序列中的前一個(gè)元素; 35 第 5 章 容 器 類(
8、4) 使用previousIndex()方法返回下一次previous()方法調(diào)用將要返回的元素的索引;(5) 使用set()方法將上一次next()調(diào)用或previous()調(diào)用所返回的元素替換為參數(shù)所指定的元素;(6) 使用add()方法向序列中下一個(gè)next()被訪問元素之前(亦即下一個(gè)previous()被訪問元素之后)加入指定的元素。加入元素后,隱含指針在新加入元素之后,即調(diào)用next()的返回結(jié)果不變,而調(diào)用previous()的返回結(jié)果是新加入的元素。 36 第 5 章 容 器 類 37 第 5 章 容 器 類 38 第 5 章 容 器 類 39 第 5 章 容 器 類 40 第
9、 5 章 容 器 類 5.7 容 器 類 的 高 級(jí) 話 題 1. Comparable接 口Comparable接口為實(shí)現(xiàn)這個(gè)接口的類的每一個(gè)對(duì)象提供了一種全序關(guān)系,即如果一個(gè)類實(shí)現(xiàn)了Comparable接口,那么這個(gè)類的任意兩個(gè)對(duì)象就可以比較大小。這樣的一種全序關(guān)系又稱為這個(gè)類的自然順序。實(shí)際上,Comparable接口中只有一個(gè)compareTo()方法的聲明。這個(gè)類中對(duì)compareTo()方法的實(shí)現(xiàn)就是自然順序的比較方法。 41 第 5 章 容 器 類對(duì)compareTo()方法的具體實(shí)現(xiàn)應(yīng)注意以下方面: (1) 如果當(dāng)前對(duì)象小于參數(shù)對(duì)象,則返回負(fù)數(shù);如果當(dāng)前對(duì)象等于參數(shù)對(duì)象,則返回
10、0;如果當(dāng)前對(duì)象大于參數(shù)對(duì)象,則返回正數(shù)。(2) 對(duì)compareTo()的實(shí)現(xiàn)必須保證pareTo(y)的符號(hào)與pareTo(x)的符號(hào)相反,且pareTo(y)拋出異常,當(dāng)且僅當(dāng)pareTo(x)拋出異常。 42 第 5 章 容 器 類(3) 自然順序關(guān)系的傳遞性應(yīng)得到保證,即(pareTo(y)0 & & pareTo(z)0)蘊(yùn)含pareTo(z)0。(4) 實(shí)現(xiàn)必須保證pareTo(y)=0能夠蘊(yùn)含對(duì)于任意z,pareTo(z)的符號(hào)與pareTo(z)的符號(hào)相同。 43 第 5 章 容 器 類 44 第 5 章 容 器 類 45 第 5 章 容 器 類 46 第 5 章 容 器 類 47 第 5 章 容 器 類2. EnumSet與 EnumMapEnumSet中的元素必須來自某個(gè)枚舉類型,當(dāng)創(chuàng)建EnumSet時(shí),必須指定這個(gè)枚舉類型。EnumSet的內(nèi)部是由位向量表示的,以保證其高效性。EnumSet除了包含從Set接口繼承的方法之外,還包含一些特有的接口方法,見表5-5。 48 第 5 章 容 器 類 49 第 5 章 容 器 類 50 第 5 章 容 器 類 51 第 5 章 容 器 類 52 第 5 章 容 器 類