版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
-1-理解泛型的概念掌握泛型類的創(chuàng)建和使用理解泛型的有界類型和通配符的使用了解泛型的局限性理解Java集合框架的結(jié)構(gòu)掌握Java迭代器接口的使用掌握List、Set、Map等結(jié)構(gòu)集合類的使用掌握foreach語句的使用目標-2-泛型概述什么是泛型 泛型是JDK5.0的新特性,泛型的本質(zhì)是參數(shù)化類型,即所操作的數(shù)據(jù)類型被指定為一個參數(shù)。這種類型參數(shù)可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。
Java語言引入泛型的目的主要是為了類型安全。 在JDK5.0之前,沒有泛型的情況的下,使用Object類型的變量來代表任意類型的數(shù)據(jù),但“任意化”帶來的缺點是需要顯式的強制類型轉(zhuǎn)換,此種轉(zhuǎn)換要求開發(fā)者必須明確知道變量的真實類型。對于強制類型轉(zhuǎn)換錯誤的情況,編譯器可能不提示錯誤,但在運行的時候會出現(xiàn)異常,這是一個安全隱患。-3-泛型概述-1不使用泛型實現(xiàn)參數(shù)化類型publicclassNoGeneric{ privateObjectob;//定義一個通用類型成員
publicNoGeneric(Objectob){ this.ob=ob; } publicObjectgetOb(){ returnob; } publicvoidsetOb(Objectob){ this.ob=ob; } publicvoidshowType(){ System.out.println("實際類型是:"+ob.getClass().getName()); }}-4-泛型概述-2再創(chuàng)建一個Integer版本和String版本的NoGeneric對象進行測試,代碼如下:publicclassNoGenericDemo{ publicstaticvoidmain(String[]args){ //定義類NoGeneric的一個Integer版本
NoGenericintOb=newNoGeneric(newInteger(88)); intOb.showType(); inti=(Integer)intOb.getOb(); System.out.println("value="+i); //定義類NoGeneric的一個String版本
System.out.println("----------------------------------"); NoGenericstrOb=newNoGeneric("HelloGen!“); strOb.showType(); Strings=(String)strOb.getOb(); System.out.println("value="+s); }}執(zhí)行結(jié)果如下:實際類型是:java.lang.Integervalue=88---------------------------------實際類型是:java.lang.Stringvalue=HelloGen!-5-泛型概述-3使用泛型實現(xiàn)參數(shù)化類型 首先利用泛型定義泛型類Generic,代碼如下:
publicclassGeneric<T>{privateTob;//定義泛型成員變量
publicGeneric(Tob){ this.ob=ob;}publicTgetOb(){ returnob;}publicvoidsetOb(Tob){ this.ob=ob;}publicvoidshowTyep(){ System.out.println("實際類型是:"+ob.getClass().getName());}}-6-泛型概述-4再創(chuàng)建一個Integer版本和String版本的Generic對象進行測試,代碼如下:publicclassGenericDemo{ publicstaticvoidmain(String[]args){ //定義泛型類Genneric的一個Integer版本
Generic<Integer>intOb=newGeneric<Integer>(88); intOb.showTyep();
inti=intOb.getOb(); System.out.println("value="+i); System.out.println("----------------------------------"); //定義泛型類Genneric的一個String版本
Generic<String>strOb=newGeneric<String>("HelloGen!"); strOb.showTyep();
Strings=strOb.getOb(); System.out.println("value="+s); }}執(zhí)行結(jié)果如下:實際類型是:java.lang.Integervalue=88----------------------------------實際類型是:java.lang.Stringvalue=HelloGen!-7-泛型定義泛型語法結(jié)構(gòu)歸納為如下形式:classclass-name<type-param-list>{//…}實例化泛型類的語法結(jié)構(gòu)如下:class-name<type-param-list>obj =newclass-name<type-param-list>(cons-arg-list)用于指明當前泛型類可接受的類型參數(shù)占位符的個數(shù)-8-有界類型-1有界類型
定義泛型類時,可以向類型參數(shù)指定任何類型信息,特別是集合框架操作中,可以最大限度的提高泛型類的適用范圍。但有時候需要對類型參數(shù)的取值進行一定程度的限制,以使數(shù)據(jù)具有可操作性。
為了處理這種情況,Java提供了有界類型。在指定類型參數(shù)時可以使用extends關鍵字限制此類型參數(shù)代表的類必須繼承自指定父類或父類本身。-9-有界類型-2有界類型實例publicclassBoundGeneric<TextendsNumber>{ //定義泛型數(shù)組
T[]array; publicBoundGeneric(T[]array){ this.array=array; } //計算總和
publicdoublesum(){ doublesum=0.0; for(Telement:array){ sum=sum+element.doubleValue(); } returnsum; }}-10-有界類型-3測試BoundGeneric類publicclassBoundGenericDemo{publicstaticvoidmain(String[]args){ Integer[]intArray={1,2,3,4}; //使用整型數(shù)組構(gòu)造泛型對象
BoundGeneric<Integer>iobj=newBoundGeneric<Integer>(intArray); System.out.println("iobj的和為:"+iobj.sum()); Double[]dArray={1.0,2.0,3.0,4.0}; //使用Double型數(shù)組構(gòu)造泛型對象
BoundGeneric<Double>dobj=newBoundGeneric<Double>(dArray); System.out.println("dobj的和為:"+dobj.sum()); String[]strArray={"str1","str2"}; //下面語句將報錯,String不是Number的子類
//BoundGeneric<String>sobj=newBoundGeneric<String>(strArray);}}前兩個輸出執(zhí)行結(jié)果如下:iobj的和為:10.0dobj的和為:10.0-11-泛型的局限性Java并沒有真正實現(xiàn)泛型,是編譯器在編譯的時候在字節(jié)碼上做了手腳(稱為擦除),是編譯器級別的,虛擬機并不知道有沒有泛型。這樣做的主要原因是為了兼容Java的早期版本。但是這種實現(xiàn)理念造成Java的泛型存在一些問題。為了規(guī)避這些問題Java對泛型的使用上做了一些約束,但不可避免的還是有一些問題存在。這其中大多數(shù)限制都是由類型擦除引起的。泛型類型不能被實例化不能聲明參數(shù)化類型的數(shù)組不能用類型參數(shù)替換基本類型不能定義帶泛型的異常。不允許定義Throwable的泛型子類。不能在靜態(tài)變量或者靜態(tài)方法中引用類中聲明的類型參數(shù)。
-12-集合概述-1集合框架
Java中對常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范和實現(xiàn)。所有抽象出來的數(shù)據(jù)結(jié)構(gòu)和操作統(tǒng)稱為Java集合框架(JavaCollectionFramework,簡稱JCF)。集合框架的引入給編程操作帶來了如下的優(yōu)勢:集合框架強調(diào)了軟件的復用。集合框架通過提供有用的數(shù)據(jù)結(jié)構(gòu)和算法,使開發(fā)者能集中注意力于程序的重要部分上集合框架通過提供對有用的數(shù)據(jù)結(jié)構(gòu)(動態(tài)數(shù)組、鏈接表、樹和散列表等)和算法的高性能、高質(zhì)量的實現(xiàn)使程序的運行速度和質(zhì)量得到提高集合框架必須允許不同類型的數(shù)據(jù)以相同的方式和高度互操作方式工作集合框架允許擴展或修改集合框架API易學易用集合框架主要由一組用來操作對象的接口組成,不同接口描述一組不同數(shù)據(jù)類型-13-集合概述-2Java的集合框架主要由一組用來操作對象的接口組成,不同接口描述一組不同數(shù)據(jù)類型。抽其核心,主要接口有:Collection、List、Set和Map。簡化框架圖如下所示:-14-Collection接口Collection接口
Collection接口是構(gòu)造集合框架的基礎,用于表示任何對象的集合。該接口中聲明了所有集合都擁有的核心方法,例如基本的添加、刪除操作等,并且提供了一組操作成批對象的方法,還提供了支持查詢操作如判斷集合是否為空的方法等。Collection在使用時需要注意以下事項:
其中幾種方法可能會引發(fā)一個UnsupportedOperationException異常當企圖將一個不兼容的對象加入一個類集中時,將產(chǎn)生ClassCastException異常Collection并沒有get()方法來隨機訪問第幾個元素。只能通過iterator()遍歷元素-15-List接口List接口
List是最常用的一種集合。List接口繼承了Collection接口,元素允許重復,以元素添加的次序來放置元素,不會重新排列。該接口不但能夠?qū)α斜淼囊徊糠诌M行處理,還允許針對位置索引的隨機操作。它的具體實現(xiàn)類常用的有ArrayList和LinkedList。List在使用時需要注意以下事項:
如果集合不可更改,其中幾個方法將引發(fā)一個UnsupportedOperationException異常當企圖將一個不兼容的對象加入一個類集中時,將產(chǎn)生ClassCastException異常如果使用無效索引,一些方法將出IndexOutOfBoundsException異常-16-Set接口和Map接口Set接口
Set接口繼承Collection接口,Set中的對象元素不能重復,其元素添加后采用自己內(nèi)部的一個排列機制。Set接口沒有引入新方法,可以說Set就是一個Collection,只是行為不同。它的常用具體實現(xiàn)有HashSet和TreeSet類。Map接口
Map接口沒有繼承Collection接口。Map接口是用于維護鍵/值對(key/value)的集合,Map容器中的鍵不允許重復,而值可以是任意對象。Map有兩種比較常用的實現(xiàn):HashMap和TreeMap。
-17-Collections類和Arrays類Collections和Arrays
集合框架中還有兩個很實用的輔助類:Collections和Arrays。Collections提供了對一個Collection類型的容器進行諸如排序、復制、查找和填充等一些非常有用的方法;Arrays則提供了針對數(shù)組進行類似操作的方法。
-18-迭代器Iterator接口
為了支持對Collection進行一致的遍歷操作,Java的集合框架提供了Iterator接口,使用者可以采用一致的方式操作Collection,而不需知道這個Collection的具體實現(xiàn)類型。Iterator接口中的方法能以迭代方式逐個訪問集合中各個元素,并安全的從Collection中刪除元素。ListIterator接口
ListIterator接口繼承Iterator接口,是列表迭代器,用以支持添加或更改底層集合中的元素,允許程序員雙向訪問、修改列表。ListIterator沒有當前位置,光標位于調(diào)用previous和next方法返回的值之間,是一個長度為n的列表,有n+1個有效索引值。
-19-ListArrayList
ArrayList支持可隨需要而調(diào)整的動態(tài)數(shù)組。其內(nèi)部封裝了一個動態(tài)再分配的Object[]數(shù)組。每個ArrayList對象有一個capacity。這個capacity表示存儲列表中元素的數(shù)組的容量。當元素添加到ArrayList時,它的capacity可根據(jù)需要的容量自動增加。在向一個ArrayList對象添加大量元素的程序中,可使用ensureCapacity()方法增加capacity,此方法可以減少重分配的次數(shù)。LinkedList
LinkedList類提供了一個鏈表數(shù)據(jù)結(jié)構(gòu),更適合頻繁的數(shù)據(jù)增刪操作。-20-List-1for-each
JDK5.0提供了一種全新的for循環(huán)——for-each形式,for-each可以遍歷實現(xiàn)Iterable接口的任何對象的集合,其操作形式比迭代器更方便有效。
for-each遍歷實例publicclassArrayListDemo{ //......省略代碼部分
//使用for-each遍歷
publicstaticvoidtravel2(){
for(Stringstr:arrayList){ System.out.println(str); } } //......省略代碼部分}-21-SetHashSet
HashSet能快速定位一個元素。該結(jié)構(gòu)使用散列表進行存儲。
publicclassHashSetDemo{ publicstaticvoidmain(Stringargs[]){
HashSet<String>hashSet=newHashSet<String>(); //添加元素
hashSet.add("first"); hashSet.add("second"); hashSet.add("third"); hashSet.add("forth"); System.out.println(hashSet); //遍歷
for(Stringstr:hashSet){ System.out.println(str); } }}執(zhí)行結(jié)果如下:[forth,second,third,first]forthsecondthirdfirst-22-Set-2TreeSet
TreeSet是使用樹結(jié)構(gòu)來進行存儲,并且能夠保證元素已排序。存儲大量的需要進行快速檢索的排序信息的情況下,TreeSet是一個很好的選擇。TreeSet實例演示publicclassTreeSetDemo{ publicstaticvoidmain(Stringargs[]){ TreeSet<String>treeSet=newTreeSet<String>(); //添加元素
treeSet.add("first"); treeSet.add("second"); treeSet.add("third"); treeSet.add("forth"); System.out.println(treeSet); //遍歷
for(Stringstr:treeSet){ System.out.println(str); } }}執(zhí)行結(jié)果如下:[first,forth,second,third]firstforthsecondthird-23-MapMap Map是一種把鍵對象和值對象關聯(lián)的容器,Map中的鍵不允許重復。
Map中提供了Map.Entry接口,通過Map的entrySet方法返回一個實現(xiàn)Map.Entry接口的對象集合,使得可以單獨操作Map的項(鍵/值對),在Map中的每一個項,就是一個Map.Entry對象,通過遍歷每一個Entry,可以獲得每一個條目的鍵或值并對值進行更改
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度草莓種植基地環(huán)境保護與可持續(xù)發(fā)展合同3篇
- 二零二五年度換崗勞動合同補充協(xié)議(高端裝備制造)2篇
- 二零二四年珍貴花卉苗木銷售合同范本3篇
- 二零二四年研學旅行專業(yè)導師派遣合同3篇
- 二零二五年度出租屋租賃信息化管理系統(tǒng)合同協(xié)議書4篇
- 2025版抹灰施工項目合同履行監(jiān)督協(xié)議書3篇
- 二零二四年度醫(yī)療服務補充合同
- 二零二五年度社會安全風險評估咨詢合同2篇
- 二零二四年度知名品牌商標權(quán)轉(zhuǎn)讓及許可合同3篇
- 適應坐姿變換的胸靠式辦公椅設計研究
- 乳腺癌的綜合治療及進展
- 【大學課件】基于BGP協(xié)議的IP黑名單分發(fā)系統(tǒng)
- 2025年八省聯(lián)考高考語文試題真題解讀及答案詳解課件
- 信息安全意識培訓課件
- 2024年山東省泰安市初中學業(yè)水平生物試題含答案
- 美的MBS精益管理體系
- 中國高血壓防治指南(2024年修訂版)解讀課件
- 2024安全員知識考試題(全優(yōu))
- 2024年衛(wèi)生資格(中初級)-中醫(yī)外科學主治醫(yī)師考試近5年真題集錦(頻考類試題)帶答案
- 中國大百科全書(第二版全32冊)08
- 第六單元 中華民族的抗日戰(zhàn)爭 教學設計 2024-2025學年統(tǒng)編版八年級歷史上冊
評論
0/150
提交評論