版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
6.1集合框架概述集合Java語(yǔ)言程序設(shè)計(jì)Unit66.1集合框架概述
集合
面向?qū)ο笳Z(yǔ)言對(duì)事物的體現(xiàn)都是以對(duì)象的形式,所以為了方便對(duì)多個(gè)對(duì)象的操作,就需要對(duì)對(duì)象進(jìn)行存儲(chǔ),集合就是存儲(chǔ)對(duì)象最常用的一種方式。
集合類主要分為兩大類:Collection和Map。
集合與數(shù)組
數(shù)組和集合類同是容器,數(shù)組雖然也可以存儲(chǔ)對(duì)象,但其長(zhǎng)度是固定的,而集合的長(zhǎng)度是可變的。
此外,數(shù)組中可以存儲(chǔ)基本數(shù)據(jù)類型,而集合只能存儲(chǔ)對(duì)象,并且可以存儲(chǔ)不同類型的對(duì)象。6.1集合框架概述集合框架體系結(jié)構(gòu)集合框架簡(jiǎn)要說(shuō)明Collection接口是可以存儲(chǔ)一組可以重復(fù)的對(duì)象,是集合類的頂級(jí)接口。Set接口不允許重復(fù),使用自己內(nèi)部的一個(gè)排列機(jī)制。List接口允許重復(fù),以元素安插的次序來(lái)放置元素,不會(huì)重新排列。Map接口是一組成對(duì)的鍵-值對(duì)象,即所持有的是key-valuepairs。Map中不能有重復(fù)的key,擁有自己的內(nèi)部排列機(jī)制。默認(rèn)容器中的元素類型都為Object類型,從容器獲取時(shí)須轉(zhuǎn)換成原來(lái)的類型。MapTreeSetLinkedListCollectionHashTableHashMapArrayListListHashSetSetTreeMapQueueLinkedHashMap浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.2.1Collection接口概述6.2.2子接口及其實(shí)現(xiàn)類6.2.3Collection中的方法6.2Collectiion接口6.2.1Collection接口概述
Collection接口Collection接口位于java.util包中,是集合類的一個(gè)頂級(jí)接口,直接繼承自Collection接口的子接口有List、Set和Queue。JavaSDK不提供直接繼承自Collection的類,Collection接口通常情況下不被直接使用。
構(gòu)造函數(shù)
所有實(shí)現(xiàn)Collection接口的類都必須提供兩個(gè)標(biāo)準(zhǔn)的構(gòu)造函數(shù):
無(wú)參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)空的Collection;有一個(gè)Collection參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)新的Collection,這個(gè)新的Collection與傳入的Collection有相同的元素。后一個(gè)構(gòu)造函數(shù)允許用戶復(fù)制一個(gè)Collection。浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.2.1Collection接口概述6.2.2子接口及其實(shí)現(xiàn)類6.2.3Collection中的方法6.2Collectiion接口6.2.2子接口及其實(shí)現(xiàn)類Collection接口的常用子接口有List和Set。List接口的實(shí)現(xiàn)類有ArrayList和LinkedList。Set接口的實(shí)現(xiàn)類有HashSet和TreeSet。6.2.2子接口及其實(shí)現(xiàn)類1List接口List是有序的Collection,使用此接口能夠精確地控制每個(gè)元素插入的位置。用戶能夠使用索引(元素在List中的位置)來(lái)訪問(wèn)List中的元素,List中允許有相同的元素,這種方式類似于Java的數(shù)組。ArrayList類:ArrayList實(shí)現(xiàn)了可變大小的數(shù)組,它允許所有元素,包括null。每個(gè)ArrayList實(shí)例都有一個(gè)容量,即用于存儲(chǔ)元素的數(shù)組的大小,這個(gè)容量可隨著不斷添加新元素而自動(dòng)增加。LinkedList類:LinkedList實(shí)現(xiàn)了List接口,允許null元素,提供額外的get、remove、insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack)、隊(duì)列(queue)或雙向隊(duì)列(deque)。Vector類:Vector非常類似ArrayList,但是Vector是同步的。Stack類:Stack繼承自Vector,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧。List接口的實(shí)現(xiàn)類6.2.2子接口及其實(shí)現(xiàn)類Set是一種不包含重復(fù)元素的Collection,即任意的兩個(gè)元素e1和e2都有e1.equals(e2)=false,Set中最多有一個(gè)null元素。HashSet類:HashSet不能保證元素的排列順序,順序有可能發(fā)生變化,不是同步的,集合元素可以是null,但只能放入一個(gè)null。TreeSet類:TreeSet可以確保集合元素處于排序狀態(tài),TreeSet支持兩種排序方式,自然排序和定制排序。LinkedHashSet類:繼承自HashSet類,同樣是根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置,但是它同時(shí)使用鏈表維護(hù)元素的次序。2Set接口Set接口的實(shí)現(xiàn)類浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.2.1Collection接口概述6.2.2子接口及其實(shí)現(xiàn)類6.2.3Collection中的方法6.2Collectiion接口6.2.3Collection中的方法Collection接口是集合的頂層接口,通常不能直接使用,但該接口提供了添加元素、刪除元素以及一些其他方法。
由于List接口和Set接口等都繼承了Collection接口,因此這些方法對(duì)List集合和Set集合都是通用的。6.2.3Collection中的方法返回值類型方法名稱和參數(shù)方法說(shuō)明booleanadd(Objecto)將對(duì)象添加到集合booleanremove(Objecto)
如果集合中有與o相匹配的對(duì)象則刪除對(duì)象ointsize()返回當(dāng)前集合中元素的數(shù)量booleanisEmpty()判斷結(jié)合中是否有任何元素booleancontains(Objecto)
查找集合中是否含有元素oIteratoriterator()返回一個(gè)迭代器用來(lái)訪問(wèn)集合中的各個(gè)元素booleancontainsAll(Collectionc)查找集合中是否含有集合c中的所有元素booleanaddAll(Collectiionc)將集合c中的所有元素添加給該集合voidclear()刪除集合中所有的元素voidremoveAll(Collectionc)從集合中刪除集合c中的所有元素voidretainAll(Collectionc)
從集合中刪除集合c中不包含的元素Object[]toArray()返回一個(gè)內(nèi)含集合所有元素的數(shù)組Object[]toArray(Object[]a),返回一個(gè)內(nèi)含集合所有元素的數(shù)組,運(yùn)行期返回的數(shù)組和參數(shù)a的類型相同Collection接口的常用方法浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.3.1List接口概述6.3.2ArrayList類6.3.3LinkedList類6.3List接口6.3.1List接口概述List接口位于java.util包中,直接繼承自Collection接口。List集合代表一個(gè)元素有序并且可重復(fù)的集合,集合中每個(gè)元素都有對(duì)應(yīng)的順序索引。(1)publicObjectget(intindex)--根據(jù)下標(biāo)返回列表中的元素。(2)publicObjectadd(intindex,Objectelement)--在列表的指定位置插入指定元素,將當(dāng)前處于該位置的元素(如果有的話)和所有后續(xù)元素向右移動(dòng)。(3)publicObjectset(intindex,Objectelement)--用指定元素替換列表中指定位置的元素。(4)publicObjectremove(intindex)--移除列表中指定位置的元素。List接口新增的常用方法List接口常用的實(shí)現(xiàn)類
ArrayList、LinkedList、Vector、Stack等。浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.3.1List接口概述6.3.2ArrayList類6.3.3LinkedList類6.3List接口6.3.2ArrayList類優(yōu)點(diǎn)缺點(diǎn)
允許包含所有元素,包括NULL,使用ArrayList可以根據(jù)索引位置對(duì)集合進(jìn)行快速地隨機(jī)訪問(wèn)。向指定的索引位置插入對(duì)象或刪除對(duì)象的速度較慢,因?yàn)橄蛩饕恢貌迦雽?duì)象時(shí)會(huì)將指定索引位置及之后的所有對(duì)象相應(yīng)向后移動(dòng)一位。ArrayList是List接口的直接實(shí)現(xiàn)類,實(shí)現(xiàn)了可變的數(shù)組功能。6.3.2ArrayList類
那么什么時(shí)候使用Array(數(shù)組),什么時(shí)候使用ArrayList呢?答案是:當(dāng)我們不知道到底有多少個(gè)數(shù)據(jù)元素的時(shí)候就可使用ArrayList。如果知道數(shù)據(jù)集合有多少個(gè)元素就使用數(shù)組。6.3.2ArrayList類1ArrayList構(gòu)造方法01Arraylist()
這個(gè)構(gòu)造方法構(gòu)造了一個(gè)空的鏈表。02ArrayList(Collection<?extendsE>c)
這個(gè)構(gòu)造方法構(gòu)造了一個(gè)包含指定元素集合的鏈表,注意,這里的字符E是一個(gè)標(biāo)記,用來(lái)表示集合中元素的類型。03ArrayList(intinitialCapacity)
這個(gè)構(gòu)造方法構(gòu)造了一個(gè)指定大小但內(nèi)容為空的鏈表。initialCapacity參數(shù)就是初始容量大小。6.3.2ArrayList類1ArrayList構(gòu)造方法舉例:
如果需要?jiǎng)?chuàng)建一個(gè)空的數(shù)組鏈表用來(lái)存放String類型的對(duì)象舉例:
如果你需要?jiǎng)?chuàng)建一個(gè)指定初始容量的數(shù)組鏈表可編寫(xiě)的代碼:ArrayList<String>list=newArrayList<String>();可編寫(xiě)的代碼:ArrayList<Integer>list=newArrayList<Integer>(7);6.3.2ArrayList類2ArrayList常用方法(1)增加元素到鏈表中booleanadd(Elemente)--增加指定元素到鏈表尾部。voidadd(intindex,Elemente)--增加指定元素到鏈表指定位置。(2)從鏈表中刪除元素voidclear()--從鏈表中刪除所有元素。Eremove(intindex)--刪除鏈表中指定位置的元素,E為對(duì)應(yīng)的元素類型。voidremoveRange(intstart,intend)--刪除鏈表中從某一個(gè)位置開(kāi)始到某一個(gè)位置結(jié)束的元素。(3)獲取鏈表中的元素Eget(intindex)--獲取鏈表中指定位置處的元素,E為對(duì)應(yīng)的元素類型。Object[]toArray()--獲取一個(gè)數(shù)組,數(shù)組中所有元素是鏈表中的元素,即將鏈表轉(zhuǎn)換為一個(gè)數(shù)組。6.3.2ArrayList類2ArrayList常用方法(4)修改某個(gè)元素Eset(intindex,Eelement)--將鏈表中指定位置上的元素替換成新元素,E為對(duì)應(yīng)的元素類型。(5)搜索元素booleancontains(Objecto)--如果鏈表包含指定元素,返回true。intindexOf(Objecto)--返回元素在鏈表中第一次出現(xiàn)的位置,如果返回-1,表示鏈表中沒(méi)有這個(gè)元素。intlastIndexOf(Objecto)--返回元素在鏈表中最后一次出現(xiàn)的位置,如果返回-1,表示鏈表中沒(méi)有這個(gè)元素。6.3.2ArrayList類2ArrayList常用方法(7)獲取鏈表大小intsize()--返回鏈表長(zhǎng)度(鏈表包含元素的個(gè)數(shù))。(6)檢查鏈表是否為空booleanisEmpty()--返回true表示鏈表中沒(méi)有任何元素。6.3.2ArrayList類ArrayList主要用法,包括創(chuàng)建鏈表、添加元素、查找元素、替換元素、三種遍歷方法以及轉(zhuǎn)化為數(shù)組等操作。知識(shí)應(yīng)用
按模板方式截圖eclipse內(nèi)的程序,放置于此?6.3.2ArrayList類ArrayList主要用法,包括創(chuàng)建鏈表、添加元素、查找元素、替換元素、三種遍歷方法以及轉(zhuǎn)化為數(shù)組等操作。知識(shí)應(yīng)用
按模板方式截圖eclipse內(nèi)的程序,放置于此?6.3.2ArrayList類ArrayList主要用法,包括創(chuàng)建鏈表、添加元素、查找元素、替換元素、三種遍歷方法以及轉(zhuǎn)化為數(shù)組等操作。運(yùn)行結(jié)果浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.3.1List接口概述6.3.2ArrayList類6.3.3LinkedList類6.3List接口6.3.3LinkedList類優(yōu)點(diǎn)缺點(diǎn)相對(duì)于ArrayList,LinkedList插入是更快的,因?yàn)長(zhǎng)inkedList不需要改變數(shù)組的大小,也不需要在數(shù)組裝滿的時(shí)候要將所有的數(shù)據(jù)重新裝入一個(gè)新的數(shù)組。LinkedList需要更多的內(nèi)存,因?yàn)锳rrayList的每個(gè)索引的位置是實(shí)際的數(shù)據(jù),而LinkedList中的每個(gè)節(jié)點(diǎn)中存儲(chǔ)的是實(shí)際的數(shù)據(jù)和前后節(jié)點(diǎn)的位置。LinkedeList和ArrayList都實(shí)現(xiàn)了List接口。兩者之間最主要的區(qū)別在于ArrayList是可改變大小的數(shù)組,而LinkedList是雙向鏈接串列。6.3.3LinkedList類
雖然很多場(chǎng)景下ArrayList更受歡迎,但是還有些情況下LinkedList更為合適。譬如:(1)當(dāng)應(yīng)用不需要隨機(jī)訪問(wèn)數(shù)據(jù)時(shí):因?yàn)槿绻阈枰狶inkedList中的第n個(gè)元素的時(shí)候,你需要從第一個(gè)元素順序數(shù)到第n個(gè)數(shù)據(jù),然后讀取數(shù)據(jù),這樣的速度比較慢,效率不高。(2)當(dāng)應(yīng)用中插入和刪除元素操作多,隨機(jī)讀取數(shù)據(jù)操作少時(shí):因?yàn)長(zhǎng)inkedList中插入和刪除元素不涉及重排數(shù)據(jù),所以它要比ArrayList更快。6.3.3LinkedList類LinkedList新增的特有方法(1)添加首尾元素方法部publicvoidaddFirst(Objecte)—-添加元素到首部。publicvoidaddLast(Objecte)—-添加元素到尾部。(2)獲取首尾元素方法publicObjectgetFirst()—-獲取首部元素。publicObjectgetLast()—-獲取尾部元素。(3)刪除首尾元素方法publicObjectremoveFirst()—-刪除首部元素。publicObjectremoveLast()—-刪除尾部元素。6.3.3LinkedList類LinkedList主要用法,包括如何創(chuàng)建列表、添加元素、刪除元素、遍歷列表等。知識(shí)應(yīng)用
按模板方式截圖eclipse內(nèi)的程序,放置于此?6.3.3LinkedList類LinkedList主要用法,包括如何創(chuàng)建列表、添加元素、刪除元素、遍歷列表等。運(yùn)行結(jié)果浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院案例
6-1單元6集合就診時(shí)排隊(duì)叫號(hào)案例單元Java語(yǔ)言程序設(shè)計(jì)主講王昌建eclipseeclipseeclipse案例
6-1:就診時(shí)排隊(duì)叫號(hào)案例目標(biāo)
以患者到醫(yī)院就診為業(yè)務(wù)背景,體驗(yàn)取號(hào)和排隊(duì)叫號(hào)功能的實(shí)現(xiàn)機(jī)制。案例解釋
就診時(shí)按患者的取號(hào)先后順序依次叫號(hào),通知當(dāng)前就診病人的同時(shí)提示候診病人的情況。案例效果案例6-1:就診時(shí)排隊(duì)叫號(hào)實(shí)現(xiàn)思路基本步驟按實(shí)訓(xùn)要求創(chuàng)建工程并配置環(huán)境創(chuàng)建排隊(duì)叫號(hào)業(yè)務(wù)類(1)在cn.campsg.java.experiment包中創(chuàng)建叫號(hào)業(yè)務(wù)類,
QueueCaller;(2)為QueueCaller類創(chuàng)建患者排隊(duì)列表屬性:ArrayList<String>queue;(3)為QueueCaller類創(chuàng)建0參構(gòu)造器,其形式如下:(+提示:publicQueueCaller(){})1)在構(gòu)造器內(nèi)實(shí)例化患者排隊(duì)列表(queue)。(4)為QueueCaller類創(chuàng)建獲取患者數(shù)量的方法:(+提示:publicintsize(){})案例效果案例
6-1:就診時(shí)排隊(duì)叫號(hào)實(shí)現(xiàn)思路基本步驟創(chuàng)建排隊(duì)叫號(hào)業(yè)務(wù)類(5)實(shí)現(xiàn)size方法的業(yè)務(wù)邏輯:通過(guò)調(diào)用queue對(duì)象的size方法,獲取等待就診的人數(shù)。返回等待就診的人數(shù)。(6)為QueueCaller類創(chuàng)建取號(hào)方法fetchNumber:(+提示:publicvoidfetchNumber(Stringpatient){})(7)實(shí)現(xiàn)fetchNumber方法的業(yè)務(wù)邏輯:將患者姓名加入等待隊(duì)列queue。輸出患者排隊(duì)就診信息,信息如下:patient+"前面還有
"+(size()-1)+"位在等候就診。"案例效果案例
6-1:就診時(shí)排隊(duì)叫號(hào)實(shí)現(xiàn)思路基本步驟創(chuàng)建排隊(duì)叫號(hào)業(yè)務(wù)類(8)為QueueCaller類創(chuàng)建顯示候診者信息的方法:(+提示:publicvoidshowPatients(){})(9)實(shí)現(xiàn)showPatients方法的業(yè)務(wù)邏輯:1)判斷隊(duì)列(queue)中是否存在排隊(duì)等待患者,如沒(méi)有直接退出。2)如存在排隊(duì)等待患者,從隊(duì)列中獲取該患者的姓名。3)輸出患者信息,內(nèi)容:患者姓名+"候診中"。案例效果案例
6-1:就診時(shí)排隊(duì)叫號(hào)實(shí)現(xiàn)思路基本步驟創(chuàng)建排隊(duì)叫號(hào)業(yè)務(wù)類(10)為QueueCaller類創(chuàng)建叫號(hào)方法:(+提示:publicvoidcallNumber(){})(11)callNumber方法的業(yè)務(wù)邏輯如下;1)移除隊(duì)首(隊(duì)列第0位成員)患者,并返回患者姓名。2)輸出被叫號(hào)的患者信息,信息內(nèi)容:"請(qǐng)患者:"+患者姓名+"到診室就診!"。案例效果案例
6-1:就診時(shí)排隊(duì)叫號(hào)實(shí)現(xiàn)思路基本步驟顯示模擬叫號(hào)就診情況:(1)在cn.campsg.java.experiment包中創(chuàng)建主類:MainClass;(2)為MainClass創(chuàng)建入口主方法:main。(3)模擬3個(gè)患者排隊(duì)就診:1)在main方法中,創(chuàng)建1個(gè)排隊(duì)叫號(hào)器(QueueCaller)對(duì)象;2)在main方法中,向叫號(hào)器對(duì)象存入3個(gè)患者姓名;+提示QueueCallerqc=newQueueCaller();//創(chuàng)建默認(rèn)叫號(hào)排隊(duì)器for(inti=1;i<=3;i++){//取3個(gè)號(hào) qc.fetchNumber("張山-"+i);}案例效果案例
6-1:就診時(shí)排隊(duì)叫號(hào)實(shí)現(xiàn)思路基本步驟顯示模擬叫號(hào)就診情況:(4)模擬叫號(hào):1)在main方法中,循環(huán)叫號(hào)直到?jīng)]有就診患者為止。2)每次叫號(hào)后均需顯示正在排隊(duì)的患者信息。+提示while(qc.size()!=0){ qc.callNumber(); qc.showPatients();//顯示候診信息}浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.5.1Map接口概述6.5.2Map存儲(chǔ)對(duì)象原理6.5.3HashMap類6.5Map接口6.5.1Map接口概述Java中的Map接口是和Collection接口同一等級(jí)的集合根接口,它表示一個(gè)鍵值對(duì)(key-value)的映射。010203Map用于保存具有映射關(guān)系的數(shù)據(jù),因此Map集合里保存著兩組值,一組值用于保存Map里的key,另外一組值用于保存Map里的value,key和value都可以是任何引用類型的數(shù)據(jù)。Map的key不允許重復(fù),即同一個(gè)Map對(duì)象的任何兩個(gè)key通過(guò)equals方法比較總是返回false。key和value之間存在單向一對(duì)一關(guān)系,即通過(guò)指定的key總能找到唯一的、確定的value,即每一個(gè)鍵最多只能映射到一個(gè)值。注意點(diǎn)6.5.1Map接口概述HashMapTreeMapLinkedHashMap1243Map接口常用實(shí)現(xiàn)類HashTable6.5.1Map接口概述Map接口的主要方法(1)添加元素功能Vput(Kkey,Vvalue)--添加元素,如果鍵是第一次存儲(chǔ),就直接存儲(chǔ)元素,返回null;如果鍵不是第一次存儲(chǔ),之前已經(jīng)存在,就用值把以前的值替換掉并返回以前的值。(2)刪除元素功能voidclear()--移除所有的鍵值對(duì)元素。Vremove(Objectkey)--根據(jù)鍵刪除鍵值對(duì)元素,并把值返回。6.5.1Map接口概述Map接口的主要方法(3)判斷功能booleancontainsKey(Objectkey)--判斷集合是否包含指定的鍵。booleancontainsValue(Objectvalue)--判斷集合是否包含指定的值。booleanisEmpty()--判斷集合是否為空。(4)獲取元素功能Vget(Objectkey)--根據(jù)鍵獲取值。Set<K>keySet()--獲取集合中所有鍵的集合。Collection<V>values()--獲取集合中所有值的集合。intsize()--返回集合中的鍵值對(duì)的個(gè)數(shù)。浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.5.1Map接口概述6.5.2Map存儲(chǔ)對(duì)象原理6.5.3HashMap類6.5Map接口6.5.2Map存儲(chǔ)對(duì)象原理1Map的數(shù)據(jù)結(jié)構(gòu)
Map的數(shù)據(jù)結(jié)構(gòu)Map是一種容器,可以用來(lái)進(jìn)行數(shù)據(jù)或?qū)ο蟮拇鎯?chǔ),擁有自己獨(dú)特的數(shù)據(jù)結(jié)構(gòu)。Map的每一個(gè)元素叫做鍵值對(duì),所謂鍵值對(duì)其實(shí)就是“鍵”和“值”組成的一對(duì)。Map的每一個(gè)元素由兩部分組成,分別是:key(鍵)和value(值)。
Map的存取操作容器是用來(lái)裝東西的,那么容器就要有對(duì)應(yīng)的存取操作。對(duì)于“取東西”,也就是查找操作,與數(shù)組和鏈表一樣,Map在查找元素時(shí)也有自己的規(guī)則,這里Map通過(guò)查找key(鍵)的方式,來(lái)獲取相應(yīng)的value(值),并且key的值不可以重復(fù),這一點(diǎn)與數(shù)組中的下標(biāo)相似。6.5.2Map存儲(chǔ)對(duì)象原理2Map的底層實(shí)現(xiàn)原理
Map的底層實(shí)現(xiàn)Map的底層實(shí)現(xiàn)基礎(chǔ)是我們學(xué)過(guò)的數(shù)組和鏈表,因?yàn)镸ap的數(shù)據(jù)結(jié)構(gòu)問(wèn)題,Map中的各個(gè)元素之間沒(méi)有連接的關(guān)系,所以通過(guò)數(shù)組的方式存儲(chǔ)Map的每個(gè)元素。
當(dāng)然Map既然是與數(shù)組和鏈表不同的容器,他自然也有自己的優(yōu)點(diǎn)。Map同其他容器一樣,也有自己的增、刪、改對(duì)應(yīng)的操作,Map的新增方法叫做put,查找方法叫做get。6.5.2Map存儲(chǔ)對(duì)象原理2Map的底層實(shí)現(xiàn)原理//用程序模擬Map存儲(chǔ)數(shù)據(jù)的原理publicclassMyMap{privateMyMap[]myMap=newMyMap[100];privateintsize;privateObjectkey;privateObjectvalue;publicMyMap(Objectkey,Objectvalue){this.key=key;this.value=value;}publicMyMap(){}publicvoidput(Objectkey,Objectvalue){MyMapmap=newMyMap(key,value);myMap[size++]=map;}//接下一頁(yè)程序首先定義了一個(gè)類MyMap,并為該類定義了私有屬性key和value,并定義了一個(gè)與類相同類型的數(shù)組,初始大小為100。然后添加一個(gè)賦初值的構(gòu)造方法和一個(gè)無(wú)參構(gòu)造方法。定義類的成員變量和構(gòu)造方法定義一個(gè)put方法,實(shí)現(xiàn)根據(jù)傳入的參數(shù)key和value創(chuàng)建一個(gè)類的對(duì)象并加入數(shù)組中,然后使得表示數(shù)組下標(biāo)的參數(shù)size加1,從而實(shí)現(xiàn)了將給定的key和value保存到Map中的功能。定義put方法6.5.2Map存儲(chǔ)對(duì)象原理2Map的底層實(shí)現(xiàn)原理//接上一頁(yè)publicObjectget(Objectkey){for(inti=0;i<size;i++){if(key.equals(myMap[i].key)){returnmyMap[i].value;}}returnnull;}
publicstaticvoidmain(String[]args){MyMapm=newMyMap();m.put(123,12345);m.put("abc","abcdef"); System.out.println(m.get(123));System.out.println(m.get("abc"));} }定義get方法,傳入?yún)?shù)key,然后使用循環(huán)來(lái)實(shí)現(xiàn)key與myMap數(shù)組中存儲(chǔ)的元素的key進(jìn)行比較,如果相等則返回該元素的value,如果沒(méi)有匹配項(xiàng)則返回null,從而實(shí)現(xiàn)了對(duì)Map的取值操作。定義get方法編寫(xiě)了一個(gè)主方法,對(duì)該類進(jìn)行了測(cè)試,程序運(yùn)行效果如預(yù)期一致,可以將任何類型的key和value進(jìn)行存儲(chǔ),并能夠根據(jù)key的值再?gòu)腗ap中獲取并輸出。主方法測(cè)試浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.5.1Map接口概述6.5.2Map存儲(chǔ)對(duì)象原理6.5.3HashMap類6.5Map接口6.5.3HashMap類HashMap是基于哈希表的Map接口的實(shí)現(xiàn)。010203在HashMap中,key-value總是會(huì)當(dāng)做一個(gè)整體來(lái)處理,系統(tǒng)會(huì)根據(jù)hash算法來(lái)計(jì)算key-value的存儲(chǔ)位置,可以通過(guò)key快速地存取value,因此HashMap在添加和刪除映射關(guān)系時(shí)的效率更高。HashMap允許使用null值和null鍵,但必須保證鍵的唯一性。HashMap通過(guò)哈希表對(duì)其內(nèi)部的映射關(guān)系進(jìn)行快速查找,但HashMap不能保證映射的順序。注意點(diǎn)6.5.3HashMap類TreeMap是Map接口的另外一個(gè)實(shí)現(xiàn)類。如果希望Map集合中的對(duì)象也存在一定的順序則應(yīng)該選擇使用TreeMap。010203TreeMap中的映射關(guān)系存在一定的順序。TreeMap不允許null鍵。TreeMap添加、刪除操作時(shí)性能稍差。注意點(diǎn)浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.6.1遍歷集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代與比較6.6.2使用Iterator迭代器6.6.1遍歷集合的方法1集合的遍歷方法
傳統(tǒng)的for循環(huán)遍歷遍歷者自己在集合外部維護(hù)一個(gè)計(jì)數(shù)器,然后依次讀取每一個(gè)位置的元素,當(dāng)讀取到最后一個(gè)元素后停止,主要就是需要按元素的位置來(lái)讀取元素,這也是最原始的集合遍歷方法。以List的遍歷為例,其格式為:for(inti=0;i<list.size();i++){list.get(i);}6.6.1遍歷集合的方法1集合的遍歷方法
Iterator迭代器遍歷
Iterator本來(lái)是面向?qū)ο蟮囊粋€(gè)設(shè)計(jì)模式,主要目的就是屏蔽不同數(shù)據(jù)集合的特點(diǎn)進(jìn)行統(tǒng)一遍歷集合的接口。Java作為一個(gè)面向?qū)ο笳Z(yǔ)言,自然也在Collection中支持了Iterator模式。以List的遍歷為例,其格式為:Iteratoriterator=list.iterator();while(iterator.hasNext()){……iterator.next();}6.6.1遍歷集合的方法1集合的遍歷方法
For-Each循環(huán)遍歷
For-Each循環(huán)也叫增強(qiáng)型的for循環(huán)或者叫foreach循環(huán)。foreach循環(huán)避免了顯式地聲明Iterator和計(jì)數(shù)器,具有代碼簡(jiǎn)潔、不易出錯(cuò)的優(yōu)點(diǎn),但是這種方法只能做簡(jiǎn)單的遍歷,不能在遍歷過(guò)程中進(jìn)行刪除、替換數(shù)據(jù)等操作。。以List的遍歷為例,其格式為:for(ElementTypeelement:list){……}6.6.1遍歷集合的方法2Map的遍歷方法
由于Java中的所有Map都實(shí)現(xiàn)了Map接口,因此以下方法適用于任何Map的實(shí)現(xiàn)類,例如HashMap、TreeMap、LinkedHashMap、Hashtable等。
下面以一個(gè)整數(shù)類的HashMap(HashMap<Integer,Integer>)為例進(jìn)行說(shuō)明。6.6.1遍歷集合的方法2Map的遍歷方法
在foreach循環(huán)中使用entries遍歷
這是最常見(jiàn)的并且在大多數(shù)情況下也是最可取的遍歷方式,在鍵和值都需要時(shí)使用。Map<Integer,Integer>map=newHashMap<Integer,Integer>();for(Map.Entry<Integer,Integer>entry:map.entrySet()){ Integerkey=entry.getKey();Integervalue=entry.getValue();}6.6.1遍歷集合的方法2Map的遍歷方法
在foreach循環(huán)中遍歷keys或values
如果只需要map中的鍵或者值,可以通過(guò)keySet或values來(lái)實(shí)現(xiàn)遍歷,而不是用entrySet。Map<Integer,Integer>map=newHashMap<Integer,Integer>();for(Integerkey:map.keySet()){//遍歷map中的鍵
System.out.println("Key="+key);}for(Integervalue:map.values()){//遍歷map中的值
System.out.println("Value="+value);}6.6.1遍歷集合的方法2Map的遍歷方法
使用Iterator遍歷Mapmap=newHashMap();Iteratoriterator=map.entrySet().iterator();while(iterator.hasNext()){Map.Entryentry=(Map.Entry)iterator.next();Integerkey=(Integer)entry.getKey();Integervalue=(Integer)entry.getValue();System.out.println("Key="+key+",Value="+value);}6.6.1遍歷集合的方法2Map的遍歷方法
使用Iterator遍歷010203在老版本java中這是遍歷map的唯一方式。遍歷時(shí)調(diào)用iterator.remove()來(lái)刪除entries,前面兩個(gè)方法則不能。從性能方面看,該方法類同于foreach遍歷的性能。優(yōu)點(diǎn)6.6.1遍歷集合的方法2Map的遍歷方法
通過(guò)鍵找值遍歷Map<Integer,Integer>map=newHashMap<Integer,Integer>();for(Integerkey:map.keySet()){Integervalue=map.get(key);System.out.println("Key="+key+",Value="+value);}注意:該方法代碼簡(jiǎn)潔但實(shí)際上效率較低,因?yàn)閺逆I取值是耗時(shí)的操作,所以盡量避免使用浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.6.1遍歷集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代與比較6.6.2使用Iterator迭代器6.6.2使用Iterator迭代器
迭代器迭代器是一種設(shè)計(jì)模式,它是一個(gè)對(duì)象,它可以遍歷并選擇序列中的對(duì)象,而開(kāi)發(fā)人員不需要了解該序列的底層結(jié)構(gòu)。
迭代器通常被稱為“輕量級(jí)”對(duì)象,因?yàn)閯?chuàng)建它的代價(jià)小。
Iterator迭代器Java中的Iterator功能比較簡(jiǎn)單,并且只能單向移動(dòng)。6.6.2使用Iterator迭代器要求容器返回一個(gè)Iterator。Iiterator()方法獲得序列中的下一個(gè)元素,第一次調(diào)用時(shí)返回序列的第一個(gè)元素。next()方法檢查序列中是否還有元素。hasNext()方法將迭代器新返回的元素刪除。remove()方法Iterator迭代器常用的方法6.6.2使用Iterator迭代器
迭代器應(yīng)用實(shí)例代碼。知識(shí)應(yīng)用浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.6.1遍歷集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代與比較6.6.2使用Iterator迭代器6.6.3Comparable接口
Java的比較器
Java的比較器有兩類,分別是Comparable接口和Comparator接口。Comparable是在集合內(nèi)部定義的方法實(shí)現(xiàn)的排序,位于java.lang包。Comparator是在集合外部實(shí)現(xiàn)的排序,位于java.util包。6.6.3Comparable接口
類的自然排序和自然比較方法
Comparable接口強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體排序,此排序稱為該類的自然排序。
類的compareTo()方法被稱為它的自然比較方法。010203實(shí)現(xiàn)此接口的對(duì)象集合可以通過(guò)Collections.sort()進(jìn)行自動(dòng)排序。實(shí)現(xiàn)此接口的對(duì)象數(shù)組則可以通過(guò)Arrays.sort()進(jìn)行自動(dòng)排序。實(shí)現(xiàn)此接口的對(duì)象可以用作有序映射表中的鍵或有序集合中的元素,無(wú)需指定比較器。注意點(diǎn)6.6.3Comparable接口
在成績(jī)排序中一般要求先按成績(jī)(score)從高到底進(jìn)行排序,如果成績(jī)相同則按年齡(age)從低到高進(jìn)行排序。
使用Comparable接口實(shí)現(xiàn)該功能。知識(shí)應(yīng)用浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.6.1遍歷集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代與比較6.6.2使用Iterator迭代器6.6.4Comparator接口0102Comparable接口的compareTo(To)方法只有一個(gè)參數(shù)。Comparator接口中必須要被實(shí)現(xiàn)的compare(To1,To2)方法則包含兩個(gè)參數(shù)。注意點(diǎn)
如果在設(shè)計(jì)類的時(shí)候沒(méi)有考慮到讓類實(shí)現(xiàn)Comparable接口,那么就需要用到比較器接口Comparator。6.6.4Comparator接口
在成績(jī)排序中一般要求先按成績(jī)(score)從低到高進(jìn)行排序,如果成績(jī)相同則按年齡(age)從高到低進(jìn)行排序。
使用Comparator接口實(shí)現(xiàn)該功能。知識(shí)應(yīng)用浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院案例
6-2單元6集合消費(fèi)抽獎(jiǎng)案例單元Java語(yǔ)言程序設(shè)計(jì)主講王昌建eclipseeclipseeclipse案例
6-2:消費(fèi)抽獎(jiǎng)案例目標(biāo)案例解釋
以現(xiàn)實(shí)生活中的消費(fèi)抽獎(jiǎng)為業(yè)務(wù)背景,體驗(yàn)Map的實(shí)際應(yīng)用。
程序設(shè)置四種獎(jiǎng)項(xiàng),分為特定獎(jiǎng)1個(gè),一等獎(jiǎng)4個(gè),二等獎(jiǎng)6個(gè),陽(yáng)光普照獎(jiǎng)100個(gè)。每次抽中一個(gè)獎(jiǎng)項(xiàng)后,對(duì)應(yīng)獎(jiǎng)項(xiàng)的總獎(jiǎng)品數(shù)量減少一個(gè)。案例效果案例
6-2:消費(fèi)抽獎(jiǎng)實(shí)現(xiàn)思路基本步驟1.按實(shí)訓(xùn)要求創(chuàng)建工程并配置環(huán)境2.創(chuàng)建獎(jiǎng)項(xiàng)實(shí)體類:(1)在cn.campsg.java.experiment.entity包中創(chuàng)建獎(jiǎng)項(xiàng)類:Awards;(2)為Awards類定義私有屬性:name和count,并添加getter和setter方法(3)為Awards類創(chuàng)建默認(rèn)的0參構(gòu)造器。(4)為Awards類創(chuàng)建2參構(gòu)造器,實(shí)現(xiàn)對(duì)成員變量的賦值。案例效果案例
6-2:消費(fèi)抽獎(jiǎng)實(shí)現(xiàn)思路基本步驟3.創(chuàng)建抽獎(jiǎng)業(yè)務(wù)類:(1)在cn.campsg.java.experiment.entity包中創(chuàng)建抽獎(jiǎng)業(yè)務(wù)類DrawReward;(2)為DrawReward類創(chuàng)建代表獎(jiǎng)池的私有屬性rwdPool(3)為DrawReward類創(chuàng)建默認(rèn)的0參構(gòu)造器,并實(shí)例化獎(jiǎng)池對(duì)象并在獎(jiǎng)池中添加四種獎(jiǎng)項(xiàng)。(4)為DrawReward類創(chuàng)建抽獎(jiǎng)方法:draward(5)為DrawReward類創(chuàng)建顯示剩余獎(jiǎng)項(xiàng)信息方法showSurplus案例效果案例
6-2:消費(fèi)抽獎(jiǎng)實(shí)現(xiàn)思路基本步驟4.顯示模擬抽獎(jiǎng)結(jié)果(1)在包c(diǎn)n.campsg.java.experiment中創(chuàng)建業(yè)務(wù)主類:MainClass;(2)在MainClass中定義程序入口主方法:main;(3)在main方法中,創(chuàng)建1個(gè)抽獎(jiǎng)對(duì)象:DrawRewarddraw=newDrawReward();(4)在main方法中,隨機(jī)生成抽獎(jiǎng)號(hào),模擬10次抽獎(jiǎng);(5)在main方法中,調(diào)用showSurplus,展示獎(jiǎng)池的剩余獎(jiǎng)品信息。浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.8.1Stream概述6.8.3List新增方法6.8StreamAPI(新特性)6.8.2創(chuàng)建并使用Stream6.8.1Stream概述
不同的Steam
Java8引入了全新的StreamAPI。但此Stream:與javaI/O包里的InputStream和OutputStream是完全不同的概念。不同于StAX對(duì)XML解析的Stream。也不同于AmazonKinesis對(duì)大數(shù)據(jù)實(shí)時(shí)處理的Stream。StreamAPI更像集合類,但行為和集合類又有所不同,它是對(duì)集合對(duì)象功能的增強(qiáng),專注于對(duì)集合對(duì)象進(jìn)行各種非常便捷、高效的聚合操作或大批量數(shù)據(jù)操作6.8.1Stream概述
SteamAPI
StreamAPI引入的目的在于彌補(bǔ)Java函數(shù)式編程的缺陷,總體來(lái)講仍然是非常完善和強(qiáng)大,足以用很少的代碼完成許多復(fù)雜的功能。StreamAPI充分利用Lambda表達(dá)式的特性,極大地提高編程效率和程序可讀性。StreamAPI提供串行和并行兩種模式進(jìn)行匯聚操作,并發(fā)模式能夠充分利用多核處理器的優(yōu)勢(shì),使用Fork/Join并行方式來(lái)拆分任務(wù)和加速處理過(guò)程。Java8中首次出現(xiàn)的java.util.Stream,是一個(gè)函數(shù)式語(yǔ)言+多核時(shí)代綜合影響的產(chǎn)物。6.8.1Stream概述Stream不是集合元素,它不是數(shù)據(jù)結(jié)構(gòu)并不保存數(shù)據(jù),它是有關(guān)算法和計(jì)算的,它更像一個(gè)高級(jí)版本的Iterator。0102原始版本的Iterator用戶只能顯式地一個(gè)一個(gè)遍歷元素并對(duì)其執(zhí)行某些操作。高級(jí)版本的Stream,用戶只要給出需要對(duì)其包含的元素執(zhí)行什么操作,比如“過(guò)濾掉長(zhǎng)度大于10的字符串”、“獲取每個(gè)字符串的首字母”等,Stream會(huì)隱式地在內(nèi)部進(jìn)行遍歷,做出相應(yīng)的數(shù)據(jù)轉(zhuǎn)換。6.8.1Stream概述相同點(diǎn)不同點(diǎn)Stream就如同一個(gè)迭代器(Iterator),單向不可往復(fù),數(shù)據(jù)只能遍歷一次,遍歷過(guò)一次后即用盡。Stream可以并行化操作,迭代器只能命令式地、串行化操作。Stream的并行操作依賴于Java7中引入的Fork/Join框架來(lái)拆分任務(wù)和加速處理過(guò)程。浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.8.1Stream概述6.8.3List新增方法6.8StreamAPI(新特性)6.8.2創(chuàng)建并使用Stream6.8.2創(chuàng)建并使用Stream
在StreamAPI中,一個(gè)流基本上代表一個(gè)元素序列,StreamAPI提供了豐富的操作函數(shù)來(lái)計(jì)算這些元素。StreamAPI使用Lambda表達(dá)式和其它函數(shù)進(jìn)行抽象,可以使得代碼更易于理解、更為干凈。有了這些抽象,還可以做一些優(yōu)化,比如實(shí)現(xiàn)并行等。6.8.2創(chuàng)建并使用Stream123獲取一個(gè)數(shù)據(jù)源(Source)數(shù)據(jù)轉(zhuǎn)換執(zhí)行操作獲取想要的結(jié)果使用一個(gè)流的三個(gè)基本步驟
每次轉(zhuǎn)換時(shí)原有Stream對(duì)象不改變,返回一個(gè)新的Stream對(duì)象(可以有多次轉(zhuǎn)換)6.8.2創(chuàng)建并使用Stream1創(chuàng)建數(shù)據(jù)源(1)從Collection和數(shù)組創(chuàng)建Collection.stream()Collection.parallelStream()Arrays.stream(Tarray)orStream.of()(2)從BufferedReader創(chuàng)建java.io.BufferedReader.lines()(3)靜態(tài)工廠創(chuàng)建java.util.stream.IntStream.range()java.nio.file.Files.walk()(4)自己構(gòu)建java.util.Spliterator6.8.2創(chuàng)建并使用Stream2流的操作類型(1)Intermediate
一個(gè)流可以后面跟隨零個(gè)或多個(gè)Intermediate操作,其目的主要是打開(kāi)流,做出某種程度的數(shù)據(jù)映射/過(guò)濾,然后返回一個(gè)新的流,交給下一個(gè)操作使用。這類操作都是惰性化的(lazy),就是說(shuō),僅僅調(diào)用到這類方法,并沒(méi)有真正開(kāi)始流的遍歷。(2)Terminal一個(gè)流只能有一個(gè)Terminal操作,當(dāng)這個(gè)操作執(zhí)行后,流就被使用“光”了,無(wú)法再被操作。所以這必定是流的最后一個(gè)操作。執(zhí)行Terminal操作才會(huì)真正開(kāi)始流的遍歷,并且會(huì)生成一個(gè)結(jié)果。6.8.2創(chuàng)建并使用Stream2流的操作類型(3)Short-circuiting
當(dāng)操作一個(gè)無(wú)限大的Stream,而又希望在有限時(shí)間內(nèi)完成操作,則擁有一個(gè)Short-circuiting操作是必要非充分條件。例如:對(duì)于一個(gè)Intermediate操作,如果它接受的是一個(gè)無(wú)限大的Stream,但返回一個(gè)有限的新Stream,或者對(duì)于一個(gè)Terminal操作,如果它接受的是一個(gè)無(wú)限大的Stream,但要求能在有限的時(shí)間計(jì)算出結(jié)果。6.8.2創(chuàng)建并使用Stream3流的操作方法(1)Intermediate操作方法map(mapToInt,flatMap等)、filter、distinct、sorted、peek、limit、skip、parallel、sequential、unordered等。(2)Terminal操作方法forEach、forEachOrdered、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst、findAny、iterator等。(3)Short-circuiting操作方法anyMatch、allMatch、noneMatch、findFirst、findAny、limit等。6.8.2創(chuàng)建并使用StreamStream的簡(jiǎn)單應(yīng)用實(shí)例。
實(shí)現(xiàn)了從Student類實(shí)例列表中進(jìn)行篩選、列表元素?cái)?shù)量獲取、整形數(shù)據(jù)流IntStream的獲取和使用等
知識(shí)應(yīng)用浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.8.1Stream概述6.8.3List新增方法6.8StreamAPI(新特性)6.8.2創(chuàng)建并使用Stream6.8.3List新增方法返回值類型方法名稱和參數(shù)方法說(shuō)明Stream<E>stream()從集合數(shù)據(jù)源中創(chuàng)建一個(gè)連續(xù)的流Stream<E>parallelStream()從集合數(shù)據(jù)源中創(chuàng)建一個(gè)并行的流對(duì)于流的操作,集合類的頂級(jí)接口Collection中新增了兩個(gè)方法:6.8.3List新增方法
stream()方法示例作用:以list為數(shù)據(jù)源創(chuàng)建一個(gè)連續(xù)的Student對(duì)象的流。以List為例,代碼:Stream<Student>stream=list.stream()6.8.3List新增方法
parallelStream()方法示例作用:第一行代碼實(shí)現(xiàn)創(chuàng)建一個(gè)存儲(chǔ)Integer類型元素的列表,第二行代碼則展示了利用列表進(jìn)行并行的輸出操作,因而輸出顯示的順序不一定會(huì)是1、2、3、4、5、6、7、8、9,而可能是任意的順序,這就是并行流的作用效果。對(duì)于并行流的操作,觀察兩行代碼:SList<Integer>numbers=Arrays.asList(1,2,3,4,5,6,7,8,9);numbers.parallelStream().forEach(out::println);浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院集合Java語(yǔ)言程序設(shè)計(jì)Unit6主講王昌建6.9.1泛型的作用6.9.3自定義泛型6.9.4類型通配符6.9泛型6.9.2集合與泛型6.9.1泛型的作用
泛型的機(jī)制泛型是一種參數(shù)化類型的機(jī)制,它可以使得代碼適用于各種類型,從而編寫(xiě)更加通用的代碼,例如集合框架。泛型是一種編譯時(shí)類型確認(rèn)機(jī)制,提供了編譯期的類型安全,確保在泛型類型(通常為泛型集合)上只能使用正確類型的對(duì)象,避免了在運(yùn)行時(shí)出現(xiàn)ClassCastException。泛型的正常工作是依賴編譯器在編譯源碼的時(shí)候,先進(jìn)行類型檢查,然后進(jìn)行類型擦除并且在類型參數(shù)出現(xiàn)的地方插入強(qiáng)制轉(zhuǎn)換的相關(guān)指令實(shí)現(xiàn)的。6.9.1泛型的作用下面以一個(gè)簡(jiǎn)單的例子介紹泛型。先看下面的代碼:Listlist=newArrayList();list.add("zjiet");list.add(100);for(inti=0;i<list.si
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職(酒店管理)酒店管理實(shí)訓(xùn)試題及解析
- 2025-2026年高一歷史(知識(shí)歸納)下學(xué)期期末測(cè)試卷
- 2025年大學(xué)生態(tài)學(xué)(生態(tài)系統(tǒng)結(jié)構(gòu))試題及答案
- 深度解析(2026)《GBT 18311.4-2003纖維光學(xué)互連器件和無(wú)源器件 基本試驗(yàn)和測(cè)量程序 第3-4部分檢查和測(cè)量 衰減》
- 深度解析(2026)《GBT 18247.7-2000主要花卉產(chǎn)品等級(jí) 第7部分草坪》(2026年)深度解析
- 深度解析(2026)《GBT 18140-2000信息技術(shù) 130 mm盒式光盤(pán)上的數(shù)據(jù)交換 容量每盒1 G字節(jié)》
- 深度解析(2026)《GBT 17768-1999懸浮種衣劑產(chǎn)品標(biāo)準(zhǔn)編寫(xiě)規(guī)范》
- 深度解析(2026)《GBT 17625.9-2016電磁兼容 限值 低壓電氣設(shè)施上的信號(hào)傳輸 發(fā)射電平、頻段和電磁騷擾電平》(2026年)深度解析
- 共享平臺(tái)運(yùn)營(yíng)數(shù)據(jù)分析規(guī)則
- 青海交通職業(yè)技術(shù)學(xué)院《城市生態(tài)與城市環(huán)境》2025-2026學(xué)年第一學(xué)期期末試卷
- 心衰患者的康復(fù)護(hù)理
- 2026年內(nèi)科護(hù)理工作計(jì)劃范文4篇
- (正式版)JBT 11270-2024 立體倉(cāng)庫(kù)組合式鋼結(jié)構(gòu)貨架技術(shù)規(guī)范
- 陶淵明的隱逸思想
- 抖音培訓(xùn)課件
- 下肢血管疾病科普知識(shí)講座
- 持之以恒的銷售態(tài)度
- 主動(dòng)披露報(bào)告表
- 12D5 電力控制(工程圖集)
- 筑業(yè)海南省建筑工程資料表格填寫(xiě)范例與指南
- 水廠控制系統(tǒng)調(diào)試及試運(yùn)行
評(píng)論
0/150
提交評(píng)論