面向?qū)ο?教案(第25講) 泛型、集合框架_第1頁
面向?qū)ο?教案(第25講) 泛型、集合框架_第2頁
面向?qū)ο?教案(第25講) 泛型、集合框架_第3頁
面向?qū)ο?教案(第25講) 泛型、集合框架_第4頁
面向?qū)ο?教案(第25講) 泛型、集合框架_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《面向?qū)ο蟪绦蛟O(shè)計》教案第25講教學(xué)對象計算機科學(xué)技術(shù)專業(yè)授課內(nèi)容10.1泛型10.2集合框架10.3List接口及實現(xiàn)類課程標(biāo)準(zhǔn)教學(xué)目標(biāo)(一)知識目標(biāo)1.了解泛型的概念2.掌握泛型的定義和使用3.了解集合框架4.掌握List接口及實現(xiàn)類(二)能力目標(biāo)1.能夠?qū)W會泛型類的定義和使用2.熟練掌握ArrayList的基本操作,能夠熟練使用List集合解決問題教學(xué)方法采用講授法、演示法、討論法、案例教學(xué)。學(xué)時及分配(第1學(xué)時50分鐘)課堂講授30分鐘課堂練習(xí)20分鐘10.1泛型10.2集合框架學(xué)時及分配(第2學(xué)時50分鐘)課堂講授20分鐘課堂練習(xí)30分鐘10.3List接口及實現(xiàn)類知識點分析重點:泛型類型的定義和使用ArrayList的基本操作難點:泛型接口及泛型方法集合的體系結(jié)構(gòu)、迭代器教學(xué)過程設(shè)計內(nèi)容方式問題導(dǎo)入回顧一下,我們在前邊課程中定義了一個整數(shù)棧類IntStack,該類使用Integer作為棧的元素,這就限制了該類只能對Integer元素操作。如果要使這個棧類更具有通用性,我們可以使用Object作為棧的元素,因為Object類是所有類的超類,所以O(shè)bject可以引用任何對象類型。然而,這種做法無法提供類型的安全性,在進行類型轉(zhuǎn)換時可能發(fā)生類型不匹配異常。使用泛型就可以提高類型安全性,因為,它可以使類型轉(zhuǎn)換自動地、隱式地進行。所謂泛型(generics)就是帶一個或多個類型參數(shù)(typeparameter)的類或接口。對于上述討論的對象棧,可以使用泛型定義。內(nèi)容要點10.1.1泛型類泛型是帶一個或多個類型參數(shù)的類或接口?!境绦?0-1】定義一個泛型Node類表示節(jié)點,類型參數(shù)T表示節(jié)點中存放的值。Node.javapackagecom.boda.xy;publicclassNode<T>{privateTdata;//泛型成員publicNode(){}//默認(rèn)構(gòu)造方法publicNode(Tdata){//帶參數(shù)構(gòu)造方法this.data=data;}publicTgetData(){//訪問方法定義 returndata;}publicvoidsetData(Tdata){//修改方法定義 this.data=data;}//顯示類型名publicvoidshowType(){ System.out.println("T的類型是:"+data.getClass().getName());}}泛型類型的使用與方法調(diào)用類似,方法調(diào)用需向方法傳遞參數(shù),使用泛型需傳遞一個類型參數(shù),即用某個具體的類型替換T。例如,如果要在Node對象中存放Integer對象,就需要在創(chuàng)建Node對象時為其傳遞Integer類型參數(shù)。要實例化泛型類對象,也使用new運算符,但在類名后面需加上要傳遞的具體類型。varintNode=newNode<Integer>();一旦創(chuàng)建了intNode對象,就可以調(diào)用setData()方法設(shè)置其中的Integer對象,調(diào)用getData()方法返回其中的Integer對象,如下代碼所示?!境绦?0-2】NodeTest.javapackagecom.boda.xy;publicclassNodeTest{publicstaticvoidmain(String[]args){varintNode=newNode<Integer>();不需要強制類型轉(zhuǎn)換intNode.setData(999);不需要強制類型轉(zhuǎn)換varvalue=intNode.getData();System.out.println(value);intNode.showType();}}按照約定,類型參數(shù)名使用單個大寫字母表示。常用的類型參數(shù)名有:E表示元素,K表示鍵,N表示數(shù)字,T表示類型,V表示值等。10.1.2泛型接口還可以定義泛型接口。泛型可能具有多個類型參數(shù),但在類或接口的聲明中,每個參數(shù)名必須是唯一的?!境绦?0-3】定義了帶兩個參數(shù)的泛型接口Entry?!境绦?0-4】定義了實現(xiàn)Entry接口的泛型類Pair。下面語句創(chuàng)建兩個Pair類實例:varp1=newPair<Integer,String>(20,"twenty");varp2=newPair<String,String>("china","Beijing");10.1.3泛型方法泛型方法(genericmethod)是帶類型參數(shù)的方法。類的成員方法和構(gòu)造方法都可以定義為泛型方法。泛型方法的定義與泛型類型的定義類似,但類型參數(shù)的作用域僅限于聲明的方法和構(gòu)造方法內(nèi)。泛型方法可以定義為靜態(tài)的和非靜態(tài)的?!境绦?0-5】泛型方法的定義和使用。MathUtil.java參見教材。10.1.4通配符(?)的使用泛型類型本身是一個Java類型,為泛型類型傳遞不同的類型參數(shù)會產(chǎn)生不同的類型。例如:List<Object>list1=newArrayList<Object>();List<String>list2=newArrayList<String>();List<String>并不是List<Object>的子類型。因此,把一個List<String>對象傳遞給一個需要List<Object>對象的方法,將會產(chǎn)生一個編譯錯誤。請看下面代碼。publicstaticvoidprintList(List<Object>list){for(Objectelement:list){System.out.println(element);}}如果傳遞給該方法一個List<String>對象,將發(fā)生編譯錯誤。如果要使上述方法可打印任何類型的列表,可將其參數(shù)類型修改為List<?>,如下所示:publicstaticvoidprintList(List<?>list){for(Objectelement:list){System.out.println(element);}}這里,問號(?)就是通配符,它表示該方法可接受任何類型的List對象?!境绦?0-6】WildCardDemo.java10.1.5方法中有界參數(shù)有時需要限制傳遞給類型參數(shù)的類型種類,例如,要求一個方法只接受Number類或其子類的實例,這就需要使用有界類型參數(shù)(boundedtypeparameter)。有界類型分為上界和下界,上界用extends指定,下界用super指定。例如,要聲明上界類型參數(shù),應(yīng)使用問號(?),后跟extends關(guān)鍵字,然后是上界類型。這里,extends具有一般的意義,對類表示擴展(extends),對接口表示實現(xiàn)(implements)。假如要定義一個getAverage()方法,它返回一個列表中所有數(shù)字的平均值,我們希望該方法能夠處理Integer列表、Double列表等各種數(shù)字列表。但是,如果把List<Number>作為getAverage()方法的參數(shù),它將不能處理List<Integer>列表或List<Double>列表。為了使該方法更具有通用性,可以限定傳遞給該方法的參數(shù)是Number對象或其子類對象的列表,這里Number類型就是列表中元素類型的上界(upperbound)。下面案例的getAverage()方法就是這樣的參數(shù)?!境绦?0-7】BoundedTypeDemo.java10.2集合框架集合是指集中存放一組對象的一個對象。集合相當(dāng)于一個容器,它提供了保存、獲取和操作其他元素的方法。集合能夠幫助Java程序員輕松地管理對象。Java集合框架由兩種類型構(gòu)成,一個是Collection,另一個是Map。Collection對象用于存放一組對象,Map對象用于存放一組“關(guān)鍵字/值”的對象。Collection和Map是最基本的接口,它們又有子接口,這些接口的層次關(guān)系如圖12-5所示。10.3List接口及實現(xiàn)類List接口實現(xiàn)一種線性表的數(shù)據(jù)結(jié)構(gòu)。存放在

List中的所有元素都有一個下標(biāo)(從0開始),可以通過下標(biāo)訪問List中的元素。List中可以包含重復(fù)元素。List接口的實現(xiàn)類包括ArrayList、LinkedList、Vector和Stack。10.3.1List的操作List接口除繼承Collection的方法外,還定義了一些自己的方法。使用這些方法可以實現(xiàn)定位訪問、查找、迭代和返回子線性表。booleanadd(Objecte):將指定元素插入到列表末尾。voidadd(intindex,Eelement):將指定元素插入到指定下標(biāo)處。Eget(intindex):返回指定下標(biāo)處的元素。Eset(intindex,Eelement):修改指定下標(biāo)處的元素。Eremove(intindex):刪除指定下標(biāo)處的元素booleanaddAll(intindex,Collection<?extendsE>c):在指定下標(biāo)處插入集合c中的全部元素。intindexOf(Objecto):查找指定對象第一次出現(xiàn)的位置。intlastIndexOf(Objecto):查找指定對象最后一次出現(xiàn)的位置。List<E>subList(intfrom,intto):返回從from到to元素的一個子線性表。10.3.2ArrayList類ArrayList是最常用的列表實現(xiàn)類,它通過數(shù)組實現(xiàn)的集合對象。ArrayList類實際上實現(xiàn)了一個變長的對象數(shù)組,其元素可以動態(tài)地增加和刪除。它的定位訪問時間是常量時間。ArrayList的構(gòu)造方法如下:ArrayList():創(chuàng)建一個空的數(shù)組列表對象,默認(rèn)初始容量是10。初始容量指的是列表可以存放多少元素。當(dāng)列表填滿而又需要添加更多元素時,列表大小會自動增大。ArrayList(Collectionc):用集合c中的元素創(chuàng)建一個數(shù)組列表對象。ArrayList(intinitialCapacity):創(chuàng)建一個空的數(shù)組列表對象,并指定初始容量。下列代碼創(chuàng)建一個ArrayList對象向其中插入幾個元素,并使用ArrayList的有關(guān)方法對它操作。varbigCities=newArrayList<String>();bigCities.add("北京");bigCities.add("上海");bigCities.add("廣州");System.out.println(bigCities.size());bigCities.add(2,"倫敦");//插入元素bigCities.set(2,"紐約");//修改元素System.out.println(bigCities.contains("北京"));System.out.println(bigCities);System.out.println(bigCities.indexOf("巴黎"));10.3.3遍歷集合元素在使用集合時,遍歷集合元素是最常見的任務(wù)。遍歷集合中的元素有多種方法:用簡單的for循環(huán)、用增強的for循環(huán)和用Iterator迭代器對象。1.使用簡單的for循環(huán)使用簡單的for循環(huán)可以遍歷集合中的每個元素。for(vari=0;i<bigCities.size();i++){System.out.print(bigCities.get(i)+"");}2.使用增強的for循環(huán)使用增強的for循環(huán)不但可以遍歷數(shù)組的每個元素,還可以遍歷集合中的每個元素。下面的代碼打印集合的每個元素:for(varcity:bigCities)System.out.println(city);上述代碼的含義是:將集合bigCities中的每個對象存儲到city變量中,然后打印輸出。使用這種方法只能按順序訪問集合中的元素,不能修改和刪除集合元素。3.使用迭代器迭代器是一個可以遍歷集合中每個元素的對象。調(diào)用集合對象的iterator()方法可以得到Iterator對象,再調(diào)用Iterator對象的方法就可以遍歷集合中的每個元素。Iterator接口定義了如下3個方法。booleanhasNext():返回迭代器中是否還有對象。Enext():返回迭代器中下一個對象。voidremove():刪除迭代器中的當(dāng)前對象。Iterator使用一個內(nèi)部指針,開始它指向第一個元素的前面。如果在指針的后面還有元素,hasNext()方法返回true。調(diào)用next()方法,指針將移到下一個元素,并返回該元素。remove()方法將刪除指針?biāo)傅脑?。假設(shè)myList是ArrayList的一個對象,要訪問myList中的每個元素,可以按下列方法實現(xiàn):Iteratoriterator=myList.iterator();//得到迭代器對象while(iterator.hasNext()){System.out.println(iterator.next());}使用Iterator也可以用for循環(huán)訪問集合元素。for(variterator=myList.iterator();iterator.hasNext();){System.out.println(iterator.next());}【程序10-8】ListDemo.java10.3.4數(shù)組轉(zhuǎn)換為List對象java.util.Arrays類提供了一個asList()方法,它將數(shù)組轉(zhuǎn)換成List對象:publicstatic<T>List<T>asList(T…a)該方法提供了一個方便的從多個元素創(chuàng)建List對象的途徑,

溫馨提示

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

評論

0/150

提交評論