《跨平臺(tái)程序設(shè)計(jì)語(yǔ)言》課件-第8章 泛型與集合_第1頁(yè)
《跨平臺(tái)程序設(shè)計(jì)語(yǔ)言》課件-第8章 泛型與集合_第2頁(yè)
《跨平臺(tái)程序設(shè)計(jì)語(yǔ)言》課件-第8章 泛型與集合_第3頁(yè)
《跨平臺(tái)程序設(shè)計(jì)語(yǔ)言》課件-第8章 泛型與集合_第4頁(yè)
《跨平臺(tái)程序設(shè)計(jì)語(yǔ)言》課件-第8章 泛型與集合_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章泛型與集合1.1泛型介紹泛型:什么是泛型Java泛型(generics)是JDK5中引入的一個(gè)新特性,泛型提供了編譯時(shí)類型安全檢測(cè)機(jī)制,該機(jī)制允許程序員在編譯時(shí)檢測(cè)到非法的類型。泛型的本質(zhì)是參數(shù)化類型,即給類型指定一個(gè)參數(shù),然后在使用時(shí)再指定此參數(shù)具體的值,那樣這個(gè)類型就可以在使用時(shí)決定了。這種參數(shù)類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。泛型類泛型類就是把泛型定義在類上。定義格式:定義泛型類,在類名后添加一對(duì)尖括號(hào),并在尖括號(hào)中填寫類型參數(shù),參數(shù)可以有多個(gè),多個(gè)參數(shù)使用逗號(hào)分隔。publicclass類名<T,...>{

}泛型類例如:示例中,定義了3個(gè)泛型參數(shù)(ab,a,c),當(dāng)然,這個(gè)后面的參數(shù)類型也是有規(guī)范的,不能像上面一樣隨意,通常類型參數(shù)我們都使用大寫的單個(gè)字母表示:publicclassGenericClass<ab,a,c>{}T:任意類型typeE:集合中元素的類型elementK:key-value形式keyV:key-value形式value泛型類使用泛型類:1.泛型類型必須是引用類型(非基本數(shù)據(jù)類型),后面課程會(huì)詳細(xì)介紹。2.使用泛型的時(shí)候,前后定義的泛型類型必須保持一致,否則會(huì)出現(xiàn)編譯異常類名稱<數(shù)據(jù)類型>對(duì)象名稱=new類名稱<數(shù)據(jù)類型>();泛型類練習(xí):編寫數(shù)組幫助類,實(shí)現(xiàn)動(dòng)態(tài)數(shù)組功能(追加元素、獲取長(zhǎng)度、根據(jù)索引獲取元素等)泛型類練習(xí):編寫數(shù)組幫助類,實(shí)現(xiàn)動(dòng)態(tài)數(shù)組功能(追加元素、獲取長(zhǎng)度、根據(jù)索引獲取元素等)泛型方法泛型方法,是在調(diào)用方法的時(shí)候指明泛型的具體類型。定義格式:與泛型類類似,只是方法聲明中定義的形參只能在該方法里使用,而接口、類聲明中定義的類型形參則可以在整個(gè)接口、類中使用。若類和方法使用同一個(gè)標(biāo)記符,則方法的標(biāo)記符會(huì)覆蓋類的標(biāo)記符。修飾符<代表泛型的變量>返回值類型方法名(參數(shù)){//方法體}泛型方法使用泛型方法:在調(diào)用泛型方法的時(shí)候,可以指定泛型,也可以不指定泛型。在不指定泛型的情況下,泛型變量的類型為該方法中的幾種類型的同一個(gè)父類的最小級(jí),直到Object。在指定泛型的時(shí)候,該方法中的幾種類型必須是該泛型實(shí)例類型或者其子類。定義格式://調(diào)用格式<指定的類型>泛型方法(實(shí)參列表);泛型方法練習(xí):編寫泛型方法,實(shí)現(xiàn)打印數(shù)組元素值泛型方法練習(xí):編寫泛型方法,實(shí)現(xiàn)打印數(shù)組元素值測(cè)試程序第8章泛型與集合1.2包裝類為什么使用泛型泛型的好處是在編譯的時(shí)候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的,提高代碼的重用率。保證了類型的安全性。消除強(qiáng)制轉(zhuǎn)換。避免了不必要的裝箱、拆箱操作,提高程序的性能。提高了代碼的重用性使用泛型的約束和限制1.不能使用基本數(shù)據(jù)類型實(shí)例化類型參數(shù)。Java泛型中的類型參數(shù)不能是基本類型,只能是類或接口類型。例如,以下代碼在編譯階段會(huì)出錯(cuò),無(wú)法通過編譯:正確的寫法是使用基本類型對(duì)應(yīng)的包裝類型,如下所示:List<long>arrs=newArrayList<long>();List<Long>arrs=newArrayList<Long>();使用泛型的約束和限制2.無(wú)法在運(yùn)行時(shí)獲取泛型類型信息。由于泛型擦除的存在,導(dǎo)致我們?cè)诔绦蜻\(yùn)行時(shí)無(wú)法獲取泛型類型的信息。例如,以下代碼在運(yùn)行時(shí)就無(wú)法獲取List的元素類型:所謂的泛型擦除(TypeErasure),就是指在編譯時(shí),JVM編譯器會(huì)將所有的泛型信息都擦除掉,變成原始類型,一般是將泛型的類型參數(shù)替換成具體類型的上限或下限(如果沒有指定上界,則默認(rèn)為Object)。List<String>arrs=newArrayList<String>();System.out.println(arrs.getClass()); //輸出的是classjava.util.ArrayList使用泛型的約束和限制3.不能創(chuàng)建參數(shù)化類型的數(shù)組(泛型數(shù)組)。例如,以下代碼是錯(cuò)誤的寫法:MyPrint<String>pairs[]=newMyPrint<String>[10];//錯(cuò)誤4.不能實(shí)例化類型變量T。不能使用像newT(...)、newT[...]或者T.class這樣的表達(dá)式。例如,下面T的構(gòu)造方法是非法:Tt=newT();//錯(cuò)誤使用泛型的約束和限制5.泛型類的靜態(tài)上下文中類型變量無(wú)效。靜態(tài)變量不能定義泛型類型,靜態(tài)方法的返回類型不能定義為泛型類型。例如,下面的寫法是錯(cuò)誤的:publicclassInterval<T>{privatestaticTsingleInstance; //錯(cuò)誤,靜態(tài)變量的類型不能為泛型類型publicstaticTgetSingleInstance() //錯(cuò)誤,靜態(tài)方法的返回類型為泛型類型。{ returnsingleInstance;}}包裝類Java是一個(gè)面向?qū)ο蟮木幊陶Z(yǔ)言,但是Java中的八種基本數(shù)據(jù)類型卻是不面向?qū)ο蟮?,為了使用方便和解決這個(gè)不足,在設(shè)計(jì)類時(shí)為每個(gè)基本數(shù)據(jù)類型設(shè)計(jì)了一個(gè)對(duì)應(yīng)的類進(jìn)行代表,這樣八種基本數(shù)據(jù)類型對(duì)應(yīng)的類統(tǒng)稱為包裝類(WrapperClass),包裝類均位于java.lang包。而且,如果只有基本數(shù)據(jù)類型,使用時(shí)是很不方便的,比如,在集合類中,無(wú)法將int、double等類型放進(jìn)去的,因?yàn)榧系娜萜饕笤厥荗bject類型。此外,包裝類還為基本類型添加了屬性和方法,豐富了基本類型的操作。如當(dāng)我們想知道int取值范圍的最小值,我們需要通過運(yùn)算,但是有了包裝類,我們可以直接使用Integer.MAX_VALUE即可。包裝類總結(jié):除了int(包裝類為Integer)和char(包裝類為Character)外,其他數(shù)據(jù)類型的包裝類型都是自己的首字母大寫,所有記憶起來會(huì)比較容易。各數(shù)據(jù)類型對(duì)應(yīng)的包裝類:第8章泛型與集合2.1集合基本概念什么是集合集合:為了保存數(shù)量不確定的數(shù)據(jù),以及保存具有映射關(guān)系的數(shù)據(jù)(也被稱為關(guān)聯(lián)數(shù)組),Java提供了集合類。集合類主要負(fù)責(zé)保存、盛裝其他數(shù)據(jù),因此集合類也被稱為容器類。Java所有的集合類都位于java.util包下,提供了一個(gè)表示和操作對(duì)象集合的統(tǒng)一構(gòu)架,包含大量集合接口,以及這些接口的實(shí)現(xiàn)類和操作它們的算法。Java集合框架Java集合框架主要包括兩種類型的容器一種是集合(Collection),存儲(chǔ)一個(gè)元素集合。另一種是圖(Map),存儲(chǔ)鍵/值對(duì)映射。集合特點(diǎn)接口名稱作用Collection接口是List、Set和Queue的父接口,是存放一組單值的最大接口。所謂的單值是指集合中的每個(gè)元素都是一個(gè)對(duì)象。一般很少直接使用此接口直接操作。List接口是最常用的接口。是有序集合,允許有相同的元素。使用List能夠精確地控制每個(gè)元素插入的位置,用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標(biāo))來訪問List中的元素,與數(shù)組類似。Set接口不能包含重復(fù)的元素。Map接口是存放一對(duì)值的最大接口,即接口中的每個(gè)元素都是一對(duì),以key?value的形式保存。Java集合接口集合特點(diǎn)類名稱作用HashSet為優(yōu)化査詢速度而設(shè)計(jì)的Set。它是基于HashMap實(shí)現(xiàn)的,HashSet底層使用HashMap來保存所有元素,實(shí)現(xiàn)比較簡(jiǎn)單TreeSet實(shí)現(xiàn)了Set接口,是一個(gè)有序的Set,這樣就能從Set里面提取一個(gè)有序序列ArrayList一個(gè)用數(shù)組實(shí)現(xiàn)的List,能進(jìn)行快速的隨機(jī)訪問,效率高而且實(shí)現(xiàn)了可變大小的數(shù)組LinkedList對(duì)順序訪問進(jìn)行了優(yōu)化,但隨機(jī)訪問的速度相對(duì)較慢。此外它還有addFirst()、addLast()、getFirst()、getLast()、removeFirst()和removeLast()等方法,能把它當(dāng)成棧(Stack)或隊(duì)列(Queue)來用HsahMap按哈希算法來存取鍵對(duì)象TreeMap可以對(duì)鍵對(duì)象進(jìn)行排序Java集合實(shí)現(xiàn)類集合與數(shù)組的區(qū)別數(shù)組可以儲(chǔ)存基本數(shù)據(jù)類型和對(duì)象,而集合中只能儲(chǔ)存對(duì)象(可以以包裝類形式存儲(chǔ)基本數(shù)據(jù)類型)。數(shù)組的長(zhǎng)度是固定的,集合長(zhǎng)度是可以改變的。定義數(shù)組時(shí)必須指定數(shù)組元素類型,集合默認(rèn)其中所有元素都是Object。無(wú)法直接獲取數(shù)組實(shí)際存儲(chǔ)的元素個(gè)數(shù),length用來獲取數(shù)組的長(zhǎng)度,但可以通過size()直接獲取集合實(shí)際存儲(chǔ)的元素個(gè)數(shù)。集合有多種實(shí)現(xiàn)方式和不同的適用場(chǎng)合,而不像數(shù)組僅采用分配連續(xù)的空間方式。集合以接口和類的形式存在,具有封裝,繼承和多態(tài)等類的特性,通過簡(jiǎn)單的方法和屬性調(diào)用即可實(shí)現(xiàn)各種復(fù)雜的操作,大大提高軟件的開發(fā)效率。為什么需要集合假設(shè)要統(tǒng)計(jì)公司的年利潤(rùn),會(huì)怎么計(jì)算存儲(chǔ)這些利潤(rùn)數(shù)據(jù)呢?方案一:以變量的形式儲(chǔ)存數(shù)據(jù)量少的話,是沒問題的。但如果數(shù)據(jù)多了起來,程序及不美觀,也不便于計(jì)算,這很明顯是不是一個(gè)明智的選擇。為什么需要集合而利潤(rùn)的數(shù)據(jù)是在不斷增長(zhǎng)變化的。在Java教程中我們知道,要統(tǒng)計(jì)的數(shù)據(jù)量是不可能固定不變的,所以我們需要一個(gè)擁有可變長(zhǎng)度的容器來儲(chǔ)存。假設(shè)要統(tǒng)計(jì)公司的年利潤(rùn),會(huì)怎么計(jì)算存儲(chǔ)這些利潤(rùn)數(shù)據(jù)呢?方案二:以數(shù)組的形式儲(chǔ)存這也是行不通的,因?yàn)閿?shù)組有個(gè)致命的特點(diǎn),那就是創(chuàng)建時(shí)需要指定其長(zhǎng)度,并且在使用時(shí)長(zhǎng)度不可改變。為什么需要集合在接下來集合的使用中,會(huì)發(fā)現(xiàn)集合也不用像數(shù)組需要看著下標(biāo)來存儲(chǔ)數(shù)據(jù),直接調(diào)用add方法,就可以實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)。假設(shè)要統(tǒng)計(jì)公司的年利潤(rùn),會(huì)怎么計(jì)算存儲(chǔ)這些利潤(rùn)數(shù)據(jù)呢?方案三:以集合的形式儲(chǔ)存集合里有各種各樣的容器,而且每個(gè)容器的長(zhǎng)度都是可變的,若是空間不夠了,也會(huì)自行調(diào)節(jié)。第8章泛型與集合2.2List集合List集合介紹List集合:在Java中,List集合是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組有序、可重復(fù)的元素。它是Java集合框架中的一部分,位于java.util包下。List集合介紹List集合特點(diǎn):可重復(fù)性:List允許存儲(chǔ)相同的元素多次。也就是說,可以在List中添加重復(fù)的元素,并且它們可以保持各自的位置和順序。有序性:List中的元素按照它們被添加的順序進(jìn)行存儲(chǔ),并且可以通過索引訪問每個(gè)元素。這意味著當(dāng)我們遍歷List時(shí),元素的順序與它們添加的順序相同。List集合介紹常見的List實(shí)現(xiàn)類:List中主要有ArrayList、LinkedList兩個(gè)實(shí)現(xiàn)類。ArrayList類是一個(gè)可以動(dòng)態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。鏈表(Linkedlist)是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會(huì)按線性的順序存儲(chǔ)數(shù)據(jù),而是在每一個(gè)節(jié)點(diǎn)里存到下一個(gè)節(jié)點(diǎn)的地址。List集合介紹ArrayList和LinkedList的區(qū)別:ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。對(duì)于隨機(jī)訪問get和set,ArrayList優(yōu)于LinkedList,因?yàn)長(zhǎng)inkedList要移動(dòng)指針。對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)。List集合介紹方法名說明publicbooleanadd(要添加的元素)將指定的元素追加到此集合的末尾publicbooleanremove(要?jiǎng)h除的元素)刪除指定元素,返回值表示是否刪除成功publicEremove(intindex)刪除指定索引處的元素,返回被刪除的元素publicEset(intindex,Eelement)修改指定索引處的元素,返回被修改的元素publicEget(intindex)返回指定索引處的元素publicintsize()返回集合中的元素的個(gè)數(shù)booleancontains(Objecto)如果此列表包含指定的元素,則返回truebooleanaddAll(intindex,Collection<?extendsE>c)將指定集合中的所有元素插入到此列表中,從指定的位置開始voidclear()列表中刪除所有元素ArrayList和LinkedList通用方法:List集合練習(xí)隨機(jī)數(shù):第8章泛型與集合2.3Set集合Set集合介紹Set集合:Set是Java的一種集合,繼承自Collection接口。它沒有固定的大小限制,可以動(dòng)態(tài)地添加和刪除元素。Set集合中的元素都是唯一的,不會(huì)有重復(fù)的元素,即使是null值也只能有一個(gè)。Set集合介紹Set集合特點(diǎn):Set集合中的元素都是唯一的,不允許有重復(fù)值,且最多只允許包含一個(gè)null元素;Set集合中的元素沒有順序,無(wú)法通過索引來訪問元素,但TreeSet是有序的;Set集合沒有固定的大小限制,可以動(dòng)態(tài)地添加和刪除元素;Set集合提供了高效的元素查找和判斷方法。Set集合介紹常見的Set實(shí)現(xiàn)類:Set中主要有HashSet、TreeSet兩個(gè)實(shí)現(xiàn)類。HashSet是一個(gè)無(wú)序的集合,它的作用是提供無(wú)序的不允許有重復(fù)元素的Set集合。HashSet允許有null值;TreeSet是一個(gè)有序的集合,它的作用是提供有序的不允許有重復(fù)元素的Set集合。TreeSet不允許有null值;Set集合介紹HashSet和TreeSet的區(qū)別:HashSet是一個(gè)無(wú)序的集合,基于HashMap實(shí)現(xiàn);TreeSet是一個(gè)有序的集合,基于TreeMap實(shí)現(xiàn)。HashSet集合中允許有null元素,TreeSet集合中不允許有null元素。HashSet和TreeSet都是非同步!在使用Iterator進(jìn)行迭代的時(shí)候要注意fail-fast。Set集合介紹HashSet和TreeSet通用方法:方法名說明add?(Ee)如果指定的元素尚不存在,則將其添加到此集合(可選操作)。clear()從該集合中刪除所有元素(可選操作)。contains?(Objecto)如果此set包含指定的元素,則返回true。containsAll?(Collection<?>c)如果此集合包含指定集合的所有元素,則返回true。isEmpty()如果此集合不包含任何元素,則返回true。iterator()返回此set中元素的迭代器。remove?(Objecto)如果存在,則從該集合中移除指定的元素(可選操作)。size()返回此集合中的元素?cái)?shù)(基數(shù))。toArray()返回包含此set中所有元素的數(shù)組。Set集合練習(xí)QQ號(hào)去重:第8章泛型與集合2.4Map集合Map集合介紹Map是一種鍵-值對(duì)(key-value)集合,Map集合中的每一個(gè)元素都包含一個(gè)鍵(key)對(duì)象和一個(gè)值(value)對(duì)象。用于保存具有映射關(guān)系的數(shù)據(jù)。Map集合里保存著兩組值,一組值用于保存Map里的key,另外一組值用于保存Map里的value,key和value都可以是任何引用類型的數(shù)據(jù)。Map的key不允許重復(fù),value可以重復(fù),即同一個(gè)Map對(duì)象的任何兩個(gè)key通過equals方法比較總是返回false。Map中的key和value之間存在單向一對(duì)一關(guān)系,即通過指定的key,總能找到唯一的、確定的value。從Map中取出數(shù)據(jù)時(shí),只要給出指定的key,就可以取出對(duì)應(yīng)的value。Map集合:Map集合介紹Map集合特點(diǎn):Map是一個(gè)雙列集合,一個(gè)元素包含兩個(gè)值(一個(gè)key,一個(gè)value)Map集合中的元素,key和value的數(shù)據(jù)類型可以相同,也可以不同Map中的元素,key不允許重復(fù),value可以重復(fù)Map里的key和value是一一對(duì)應(yīng)的。Map集合介紹常見的Map實(shí)現(xiàn)類:TreeMap是Java中的一種有序鍵值對(duì)集合,它基于紅黑樹實(shí)現(xiàn),可以保證元素按照鍵的順序進(jìn)行排序。TreeMap允許null值但不允許null鍵。Map中主要有HashMap、TreeMap兩個(gè)實(shí)現(xiàn)類。HashMap是Java中的一種鍵值對(duì)集合,它允許存儲(chǔ)不重復(fù)的鍵和對(duì)應(yīng)的值,使用哈希表(數(shù)組+鏈表/紅黑樹)實(shí)現(xiàn)。HashMap中的鍵和值都可以為null。Map集合介紹HashMap和TreeMap的區(qū)別:HashMap是無(wú)序的,TreeMap是有序的HashMap通常比TreeMap快一點(diǎn)(樹和哈希表的數(shù)據(jù)結(jié)構(gòu)使然),建議多使用HashMap,在需要排序的Map時(shí)候才用TreeMap.當(dāng)push的數(shù)量達(dá)到100w的時(shí)候,TreeMap的效率比HashMap的效率就低了,也就是隨著容量的增大,TreeMap的效率降低速度比HashMap的效率降低速度要快。小容量使用TreeMap,大容量(100w級(jí))使用HashMap。。Map集合介紹方法名稱說明voidclear()刪除該Map對(duì)象中的所有key-value對(duì)。booleancontainsKey(Objectkey)查詢Map中是否包含指定的key,如果包含則返回true。booleancontainsValue(Objectvalue)查詢Map中是否包含一個(gè)或多個(gè)value,如果包含則返回true。Vget(Objectkey)返回Map集合中指定鍵對(duì)象所對(duì)應(yīng)的值。V表示值的數(shù)據(jù)類型Vput(Kkey,Vvalue)向Map集合中添加鍵

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論