《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目10 認(rèn)識(shí)泛型與集合_第1頁(yè)
《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目10 認(rèn)識(shí)泛型與集合_第2頁(yè)
《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目10 認(rèn)識(shí)泛型與集合_第3頁(yè)
《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目10 認(rèn)識(shí)泛型與集合_第4頁(yè)
《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目10 認(rèn)識(shí)泛型與集合_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程本章學(xué)習(xí)目標(biāo):●

理解泛型的概念●

掌握泛型類(lèi)的創(chuàng)建和使用●

理解泛型的有界類(lèi)型和通配符的使用,了解泛型的限制●

理解Java集合框架的結(jié)構(gòu)、迭代器接口●

掌握常用接口及實(shí)現(xiàn)類(lèi)的使用●

了解集合轉(zhuǎn)換項(xiàng)目10認(rèn)識(shí)泛型與集合任務(wù)1part了解泛型定義泛型類(lèi)的語(yǔ)法格式如下:[訪(fǎng)問(wèn)符]class類(lèi)名<類(lèi)型參數(shù)列表>{ //類(lèi)體......}其中:(1)尖括號(hào)中是類(lèi)型參數(shù)列表,可以由多個(gè)類(lèi)型參數(shù)組成,多個(gè)類(lèi)型參數(shù)之間使用“,”隔開(kāi)。(2)類(lèi)型參數(shù)只是占位符,一般使用大寫(xiě)的“T”、“U”、“V”等作為類(lèi)型參數(shù)。下述代碼示例了泛型類(lèi)的定義,代碼如下所示。classNode<T>{ privateTdata; publicNode<T>next; //省略......}1.1泛型定義

從Java7開(kāi)始,實(shí)例化泛型類(lèi)時(shí)只需給出一對(duì)尖括號(hào)“<>”即可,Java可以推斷尖括號(hào)中的泛型信息。將兩個(gè)尖括號(hào)放在一起像一個(gè)菱形,因此也被稱(chēng)為“菱形”語(yǔ)法。Java7“菱形”語(yǔ)法實(shí)例化泛型類(lèi)的格式如下:

類(lèi)名<類(lèi)型參數(shù)列表>對(duì)象=new類(lèi)名<>([構(gòu)造方法參數(shù)列表]);

例如:Node<String>myNode=newNode<>();

下述代碼示例了一個(gè)泛型類(lèi)的定義,代碼如下所示。1.1泛型定義1.2通配符通配符當(dāng)使用一個(gè)泛型類(lèi)時(shí)(包括聲明泛型變量和創(chuàng)建泛型實(shí)例對(duì)象),都應(yīng)該為此泛型類(lèi)傳入一個(gè)實(shí)參,否則編譯器會(huì)提出泛型警告。假設(shè)現(xiàn)在定義一個(gè)方法,該方法的參數(shù)需要使用泛型,但類(lèi)型參數(shù)是不確定的,此時(shí)如果考慮使用Object類(lèi)型來(lái)解決,編譯時(shí)則會(huì)出現(xiàn)錯(cuò)誤。通配符是由“?”來(lái)表示一個(gè)未知類(lèi)型,從而解決類(lèi)型被限制、不能動(dòng)態(tài)根據(jù)實(shí)例進(jìn)行確定的缺點(diǎn)。有界類(lèi)型

泛型的類(lèi)型參數(shù)可以是各種類(lèi)型,但有時(shí)候需要對(duì)類(lèi)型參數(shù)的取值進(jìn)行一定程度的限制,以便類(lèi)型參數(shù)在指定范圍內(nèi)。針對(duì)這種情況,Java提供了“有界類(lèi)型”,來(lái)限制類(lèi)型參數(shù)的取值范圍。有界類(lèi)型分兩種:

(1)使用extends關(guān)鍵字聲明類(lèi)型參數(shù)的上界。

(2)使用super關(guān)鍵字聲明類(lèi)型參數(shù)的下界。1.3有界類(lèi)型1.上界

使用extends關(guān)鍵字可以指定類(lèi)型參數(shù)的上界,限制此類(lèi)型參數(shù)必須繼承自指定的父類(lèi)或父類(lèi)本身。被指定的父類(lèi)則稱(chēng)為類(lèi)型參數(shù)的“上界(upperbound)”。

類(lèi)型參數(shù)的上界可以在定義泛型時(shí)進(jìn)行指定,也可以在使用泛型時(shí)進(jìn)行指定,其語(yǔ)法格式分別如下://定義泛型時(shí)指定類(lèi)型參數(shù)的上界[訪(fǎng)問(wèn)符]class類(lèi)名<類(lèi)型參數(shù)extends父類(lèi)>{ //類(lèi)體......}//使用泛型時(shí)指定類(lèi)型參數(shù)的上界

泛型類(lèi)<?extends父類(lèi)>

例如://定義泛型時(shí)指定類(lèi)型參數(shù)的上界publicclassGeneric<TextendsNumber>{ //類(lèi)體......}//使用泛型時(shí)指定類(lèi)型參數(shù)的上界Generic<?extendsNumber>

上述代碼限制了泛型類(lèi)Generic的類(lèi)型參數(shù)必須是Number類(lèi)及其子類(lèi),因此可以將Number類(lèi)稱(chēng)為此類(lèi)型參數(shù)的上界。Java中Number類(lèi)是一個(gè)抽象類(lèi),所有數(shù)值類(lèi)都繼承此抽象類(lèi),即Integer、Long、Float、Double等用于數(shù)值操作的類(lèi)都繼承Number類(lèi)。1.3有界類(lèi)型2.下界

使用super關(guān)鍵字可以指定類(lèi)型參數(shù)的下界,限制此類(lèi)型參數(shù)必須是指定的類(lèi)型本身或其父類(lèi),直至Object類(lèi)。被指定的類(lèi)則稱(chēng)為類(lèi)型參數(shù)的“下界(lowerbound)”。

類(lèi)型參數(shù)的下界通常在使用泛型時(shí)進(jìn)行指定,其語(yǔ)法格式如下所示:

泛型類(lèi)<?super類(lèi)型>

例如:Generic<?superString>

上述代碼限制了泛型類(lèi)Generic的類(lèi)型參數(shù)必須是String類(lèi)本身或其父類(lèi)Object,因此可以將String類(lèi)稱(chēng)為此類(lèi)型參數(shù)的下界。1.3有界類(lèi)型Java對(duì)泛型的限制如下:

(1)泛型的類(lèi)型參數(shù)只能是類(lèi)類(lèi)型(包括自定義類(lèi)),不能是簡(jiǎn)單類(lèi)型。

(2)同一個(gè)泛型類(lèi)可以有多個(gè)版本(不同參數(shù)類(lèi)型),不同版本的泛型類(lèi)的實(shí)例是不兼容的,例如:“Generic<String>”與“Generic<Integer>”的實(shí)例是不兼容的。

(3)定義泛型時(shí),類(lèi)型參數(shù)只是占位符,不能直接實(shí)例化,例如:“newT()”是錯(cuò)誤的。

(4)不能實(shí)例化泛型數(shù)組,除非是無(wú)上界的類(lèi)型通配符,例如:“Generic<String>[]a=newGeneric<String>[10]”是錯(cuò)誤的,而“Generic<?>[]a=newGeneric<?>[10]”是被允許的。

(5)泛型類(lèi)不能繼承Throwable及其子類(lèi),即泛型類(lèi)不能是異常類(lèi),不能拋出也不能捕獲泛型類(lèi)的異常對(duì)象,

例如:“classGenericException<T>extendsException”、“catch(Te)”都是錯(cuò)誤的。1.4泛型的限制任務(wù)2part了解集合2.1集合框架Java所有的集合類(lèi)都在java.util包下,從JDK5.0開(kāi)始為了處理多線(xiàn)程環(huán)境下的并發(fā)安全問(wèn)題,又在java.util.concurrent包下提供了一些多線(xiàn)程支持的集合類(lèi)。Java的集合類(lèi)主要由兩個(gè)接口派生而出:Collection和Map,這兩個(gè)接口派生出一些子接口或?qū)崿F(xiàn)類(lèi)。Collection和Map是集合框架的根接口,如圖10.1所示是Collection集合體系的繼承樹(shù)。2.1集合框架Collection接口下有3個(gè)子接口:(1)Set接口:無(wú)序、不可重復(fù)的集合;(2)Queue接口:隊(duì)列集合;(3)List接口:有序、可以重復(fù)的集合。2.1集合框架

如圖10.2所示是Map集合體系的繼承樹(shù)。

所有Map的實(shí)現(xiàn)類(lèi)用于保存具有映射關(guān)系的數(shù)據(jù),即Map保存的每項(xiàng)數(shù)據(jù)都是由key-value鍵值對(duì)組成。Map中的key用于標(biāo)識(shí)集合中的每項(xiàng)數(shù)據(jù),是不可重復(fù)的,可以通過(guò)key來(lái)獲取Map集合中的數(shù)據(jù)項(xiàng)。2.1集合框架Java中的集合分為三大類(lèi):

(1)Set集合:將一個(gè)對(duì)象添加到Set集合時(shí),Set集合無(wú)法記住添加的順序,因此Set集合中的元素不能重復(fù),否則系統(tǒng)無(wú)法識(shí)別該元素,訪(fǎng)問(wèn)Set集合中的元素也只能根據(jù)元素本身進(jìn)行訪(fǎng)問(wèn);

(2)List集合:與數(shù)組類(lèi)似,List集合可以記住每次添加元素的順序,因此可以根據(jù)元素的索引訪(fǎng)問(wèn)List集合中的元素,List集合中的元素可以重復(fù)且長(zhǎng)度是可變的;

(3)Map集合:每個(gè)元素都是有key/value鍵值對(duì)組成,可以根據(jù)每個(gè)元素的key來(lái)訪(fǎng)問(wèn)對(duì)應(yīng)的value,Map集合中的key不允許重復(fù),value可以重復(fù)。

本章主要介紹常用的集合接口及其實(shí)現(xiàn)類(lèi),例如List、Set、Map和Queue集合接口,以及對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)ArrayList、HashSet、HashMap和LinkedList。2.2迭代器接口

迭代器(Iterator)可以采用統(tǒng)一的方式對(duì)Collection集合中的元素進(jìn)行遍歷操作,開(kāi)發(fā)人員無(wú)需關(guān)心Collection集合中的內(nèi)容,也不必實(shí)現(xiàn)IEnumerable或者IEnumerator接口就能夠使用foreach循環(huán)遍歷集合中的部分或全部元素。Java從JDK5.0開(kāi)始增加了Iterable新接口,該接口是Collection接口的父接口,因此所有實(shí)現(xiàn)了Iterable的集合類(lèi)都是可迭代的,都支持foreach循環(huán)遍歷。Iterable接口中的iterator()方法可以獲取每個(gè)集合自身的迭代器Iterator。Iterator是集合的迭代器接口,定義了常見(jiàn)的迭代方法,用于訪(fǎng)問(wèn)、操作集合中的元素。Iterator接口中的方法如表10-1所示:任務(wù)3part掌握集合類(lèi)的應(yīng)用3.1Collection接口Collection接口是Set、Queue和List接口的父接口,該接口中定義的方法可以操作這三個(gè)接口中的任一個(gè)集合,Collection接口中常用的方法如表10-2所示。3.1

使用Collection需要注意以下幾點(diǎn)問(wèn)題:

(1)add()、addAll()、remove()、removeAll()和retainAll()方法可能會(huì)引發(fā)不支持該操作的UnsupportedOperationException異常。

(2)將一個(gè)不兼容的對(duì)象添加到集合中時(shí),將產(chǎn)生ClassCastException異常。

(3)Collection接口沒(méi)有提供獲取得某個(gè)元素的方法,但可以通過(guò)iterator()方法獲取迭代器來(lái)遍歷集合中的所有元素.

(4)雖然Collection中可以存儲(chǔ)任何Object對(duì)象,但不建議在同一個(gè)集合容器中存儲(chǔ)不同類(lèi)型的對(duì)象,建議使用泛型增強(qiáng)集合的安全性,以免引起ClassCastException異常。

Collection接口3.2List接口及其實(shí)現(xiàn)類(lèi)List是Collection接口的子接口,可以使用Collection接口中的全部方法。因?yàn)長(zhǎng)ist是有序、可重復(fù)的集合,所以L(fǎng)ist接口中又增加一些根據(jù)索引操作集合元素的方法,常用的方法如表10-3所示。3.3Set接口及其實(shí)現(xiàn)類(lèi)Set集合類(lèi)似一個(gè)罐子,可以將多個(gè)元素丟進(jìn)罐子里,但不能記住元素的添加順序,因此不允許包含相同的元素。Set接口繼承Collection接口,沒(méi)有提供任何額外的方法,其用法與Collection一樣,只是特性不同(Set中的元素不重復(fù))。Set接口常用的實(shí)現(xiàn)類(lèi)包括HashSet、TreeSet和EnumSet,這三個(gè)實(shí)現(xiàn)類(lèi)各具特色:

(1)HashSet是Set接口的典型實(shí)現(xiàn)類(lèi),大多數(shù)使用Set集合時(shí)都使用該實(shí)現(xiàn)類(lèi)。HashSet使用Hash算法來(lái)存儲(chǔ)集合中的元素,具有良好的存、取以及查找性。

(2)TreeSet采用Tree“樹(shù)”的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)集合元素,因此可以保證集合中的元素處于排序狀態(tài)。TreeSet支持兩種排序方式:自然排序和定制排序,默認(rèn)情況下采用自然排序。

(3)EnumSet是一個(gè)專(zhuān)為枚舉類(lèi)設(shè)計(jì)的集合類(lèi),其所有元素必須是指定的枚舉類(lèi)型。EnumSet集合中的元素也是有序的,按照枚舉值順序進(jìn)行排序3.3Set接口及其實(shí)現(xiàn)類(lèi)HashSet及其子類(lèi)都是采用Hash算法來(lái)決定集合中元素的存儲(chǔ)位置,并通過(guò)Hash算法來(lái)控制集合的大小。Hash表中可以存儲(chǔ)元素的位置稱(chēng)為“桶(bucket)”,通常情況下,單個(gè)桶只存儲(chǔ)一個(gè)元素,此時(shí)性能最佳,Hash算法可以根據(jù)HashCode值計(jì)算出桶的位置,并從桶中取出元素。但當(dāng)發(fā)生Hash沖突時(shí),單個(gè)桶會(huì)存儲(chǔ)多個(gè)元素,這些元素以鏈表的形式存儲(chǔ)。

3.4Queue接口及其實(shí)現(xiàn)類(lèi)Queue用于模擬隊(duì)列這種數(shù)據(jù)結(jié)構(gòu),通常以“先進(jìn)先出(FIFO)”的方式排序各個(gè)元素,即最先入隊(duì)的元素最先出隊(duì)。Queue接口繼承Collection接口,除了Collection接口中的基本操作外,還提供了隊(duì)列的插入、提取和檢查操作,且每個(gè)操作都存在兩種形式:一種操作失敗時(shí)拋出異常;另一種操作失敗時(shí)返回一個(gè)特殊值(null或false)。Queue接口中的常用方法如表10-4所示。3.4Queue接口及其實(shí)現(xiàn)類(lèi)Queue接口有一個(gè)PriorityQueue實(shí)現(xiàn)類(lèi)。PriorityQueue類(lèi)是基于優(yōu)先級(jí)的無(wú)界隊(duì)列,通常稱(chēng)為“優(yōu)先級(jí)隊(duì)列”。優(yōu)先級(jí)隊(duì)列的元素按照其自然順序或定制排序,優(yōu)先級(jí)隊(duì)列不允許使用null元素,依靠自然順序的優(yōu)先級(jí)隊(duì)列不允許插入不可比較的對(duì)象。

3.4Queue接口及其實(shí)現(xiàn)類(lèi)

除此之外,Queue還有一個(gè)Deque接口,Deque代表一個(gè)“雙端隊(duì)列”,雙端隊(duì)列可以同時(shí)從兩端來(lái)添加、刪除元素。Deque接口中定義在雙端隊(duì)列兩端插入、移除和檢查元素的方法,其常用方法如表10-5所示。3.4Queue接口及其實(shí)現(xiàn)類(lèi)Java為Deque提供了ArrayDeque和LinkedList兩個(gè)實(shí)現(xiàn)類(lèi)。ArrayDeque稱(chēng)為“數(shù)組雙端隊(duì)列”,是Deque接口的實(shí)現(xiàn)類(lèi),其特點(diǎn)如下:

(1)ArrayDeque沒(méi)有容量限制,可以根據(jù)需要增加容量;

(2)ArrayDeque不是基于線(xiàn)程安全的,在沒(méi)有外部代碼同步時(shí),不支持多個(gè)線(xiàn)程的并發(fā)訪(fǎng)問(wèn);

(3)ArrayDeque禁止添加null元素;

(4)ArrayDeque在用作

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論