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

下載本文檔

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

文檔簡介

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

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

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論