




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
6.1集合框架概述集合Java語言程序設計Unit66.1集合框架概述
集合
面向?qū)ο笳Z言對事物的體現(xiàn)都是以對象的形式,所以為了方便對多個對象的操作,就需要對對象進行存儲,集合就是存儲對象最常用的一種方式。
集合類主要分為兩大類:Collection和Map。
集合與數(shù)組
數(shù)組和集合類同是容器,數(shù)組雖然也可以存儲對象,但其長度是固定的,而集合的長度是可變的。
此外,數(shù)組中可以存儲基本數(shù)據(jù)類型,而集合只能存儲對象,并且可以存儲不同類型的對象。6.1集合框架概述集合框架體系結(jié)構(gòu)集合框架簡要說明Collection接口是可以存儲一組可以重復的對象,是集合類的頂級接口。Set接口不允許重復,使用自己內(nèi)部的一個排列機制。List接口允許重復,以元素安插的次序來放置元素,不會重新排列。Map接口是一組成對的鍵-值對象,即所持有的是key-valuepairs。Map中不能有重復的key,擁有自己的內(nèi)部排列機制。默認容器中的元素類型都為Object類型,從容器獲取時須轉(zhuǎn)換成原來的類型。MapTreeSetLinkedListCollectionHashTableHashMapArrayListListHashSetSetTreeMapQueueLinkedHashMap浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.2.1Collection接口概述6.2.2子接口及其實現(xiàn)類6.2.3Collection中的方法6.2Collectiion接口6.2.1Collection接口概述
Collection接口Collection接口位于java.util包中,是集合類的一個頂級接口,直接繼承自Collection接口的子接口有List、Set和Queue。JavaSDK不提供直接繼承自Collection的類,Collection接口通常情況下不被直接使用。
構(gòu)造函數(shù)
所有實現(xiàn)Collection接口的類都必須提供兩個標準的構(gòu)造函數(shù):
無參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個空的Collection;有一個Collection參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。后一個構(gòu)造函數(shù)允許用戶復制一個Collection。浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.2.1Collection接口概述6.2.2子接口及其實現(xiàn)類6.2.3Collection中的方法6.2Collectiion接口6.2.2子接口及其實現(xiàn)類Collection接口的常用子接口有List和Set。List接口的實現(xiàn)類有ArrayList和LinkedList。Set接口的實現(xiàn)類有HashSet和TreeSet。6.2.2子接口及其實現(xiàn)類1List接口List是有序的Collection,使用此接口能夠精確地控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置)來訪問List中的元素,List中允許有相同的元素,這種方式類似于Java的數(shù)組。ArrayList類:ArrayList實現(xiàn)了可變大小的數(shù)組,它允許所有元素,包括null。每個ArrayList實例都有一個容量,即用于存儲元素的數(shù)組的大小,這個容量可隨著不斷添加新元素而自動增加。LinkedList類:LinkedList實現(xiàn)了List接口,允許null元素,提供額外的get、remove、insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack)、隊列(queue)或雙向隊列(deque)。Vector類:Vector非常類似ArrayList,但是Vector是同步的。Stack類:Stack繼承自Vector,實現(xiàn)一個后進先出的堆棧。List接口的實現(xiàn)類6.2.2子接口及其實現(xiàn)類Set是一種不包含重復元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set中最多有一個null元素。HashSet類:HashSet不能保證元素的排列順序,順序有可能發(fā)生變化,不是同步的,集合元素可以是null,但只能放入一個null。TreeSet類:TreeSet可以確保集合元素處于排序狀態(tài),TreeSet支持兩種排序方式,自然排序和定制排序。LinkedHashSet類:繼承自HashSet類,同樣是根據(jù)元素的hashCode值來決定元素的存儲位置,但是它同時使用鏈表維護元素的次序。2Set接口Set接口的實現(xiàn)類浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.2.1Collection接口概述6.2.2子接口及其實現(xiàn)類6.2.3Collection中的方法6.2Collectiion接口6.2.3Collection中的方法Collection接口是集合的頂層接口,通常不能直接使用,但該接口提供了添加元素、刪除元素以及一些其他方法。
由于List接口和Set接口等都繼承了Collection接口,因此這些方法對List集合和Set集合都是通用的。6.2.3Collection中的方法返回值類型方法名稱和參數(shù)方法說明booleanadd(Objecto)將對象添加到集合booleanremove(Objecto)
如果集合中有與o相匹配的對象則刪除對象ointsize()返回當前集合中元素的數(shù)量booleanisEmpty()判斷結(jié)合中是否有任何元素booleancontains(Objecto)
查找集合中是否含有元素oIteratoriterator()返回一個迭代器用來訪問集合中的各個元素booleancontainsAll(Collectionc)查找集合中是否含有集合c中的所有元素booleanaddAll(Collectiionc)將集合c中的所有元素添加給該集合voidclear()刪除集合中所有的元素voidremoveAll(Collectionc)從集合中刪除集合c中的所有元素voidretainAll(Collectionc)
從集合中刪除集合c中不包含的元素Object[]toArray()返回一個內(nèi)含集合所有元素的數(shù)組Object[]toArray(Object[]a),返回一個內(nèi)含集合所有元素的數(shù)組,運行期返回的數(shù)組和參數(shù)a的類型相同Collection接口的常用方法浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.3.1List接口概述6.3.2ArrayList類6.3.3LinkedList類6.3List接口6.3.1List接口概述List接口位于java.util包中,直接繼承自Collection接口。List集合代表一個元素有序并且可重復的集合,集合中每個元素都有對應的順序索引。(1)publicObjectget(intindex)--根據(jù)下標返回列表中的元素。(2)publicObjectadd(intindex,Objectelement)--在列表的指定位置插入指定元素,將當前處于該位置的元素(如果有的話)和所有后續(xù)元素向右移動。(3)publicObjectset(intindex,Objectelement)--用指定元素替換列表中指定位置的元素。(4)publicObjectremove(intindex)--移除列表中指定位置的元素。List接口新增的常用方法List接口常用的實現(xiàn)類
ArrayList、LinkedList、Vector、Stack等。浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.3.1List接口概述6.3.2ArrayList類6.3.3LinkedList類6.3List接口6.3.2ArrayList類優(yōu)點缺點
允許包含所有元素,包括NULL,使用ArrayList可以根據(jù)索引位置對集合進行快速地隨機訪問。向指定的索引位置插入對象或刪除對象的速度較慢,因為向索引位置插入對象時會將指定索引位置及之后的所有對象相應向后移動一位。ArrayList是List接口的直接實現(xiàn)類,實現(xiàn)了可變的數(shù)組功能。6.3.2ArrayList類
那么什么時候使用Array(數(shù)組),什么時候使用ArrayList呢?答案是:當我們不知道到底有多少個數(shù)據(jù)元素的時候就可使用ArrayList。如果知道數(shù)據(jù)集合有多少個元素就使用數(shù)組。6.3.2ArrayList類1ArrayList構(gòu)造方法01Arraylist()
這個構(gòu)造方法構(gòu)造了一個空的鏈表。02ArrayList(Collection<?extendsE>c)
這個構(gòu)造方法構(gòu)造了一個包含指定元素集合的鏈表,注意,這里的字符E是一個標記,用來表示集合中元素的類型。03ArrayList(intinitialCapacity)
這個構(gòu)造方法構(gòu)造了一個指定大小但內(nèi)容為空的鏈表。initialCapacity參數(shù)就是初始容量大小。6.3.2ArrayList類1ArrayList構(gòu)造方法舉例:
如果需要創(chuàng)建一個空的數(shù)組鏈表用來存放String類型的對象舉例:
如果你需要創(chuàng)建一個指定初始容量的數(shù)組鏈表可編寫的代碼:ArrayList<String>list=newArrayList<String>();可編寫的代碼:ArrayList<Integer>list=newArrayList<Integer>(7);6.3.2ArrayList類2ArrayList常用方法(1)增加元素到鏈表中booleanadd(Elemente)--增加指定元素到鏈表尾部。voidadd(intindex,Elemente)--增加指定元素到鏈表指定位置。(2)從鏈表中刪除元素voidclear()--從鏈表中刪除所有元素。Eremove(intindex)--刪除鏈表中指定位置的元素,E為對應的元素類型。voidremoveRange(intstart,intend)--刪除鏈表中從某一個位置開始到某一個位置結(jié)束的元素。(3)獲取鏈表中的元素Eget(intindex)--獲取鏈表中指定位置處的元素,E為對應的元素類型。Object[]toArray()--獲取一個數(shù)組,數(shù)組中所有元素是鏈表中的元素,即將鏈表轉(zhuǎn)換為一個數(shù)組。6.3.2ArrayList類2ArrayList常用方法(4)修改某個元素Eset(intindex,Eelement)--將鏈表中指定位置上的元素替換成新元素,E為對應的元素類型。(5)搜索元素booleancontains(Objecto)--如果鏈表包含指定元素,返回true。intindexOf(Objecto)--返回元素在鏈表中第一次出現(xiàn)的位置,如果返回-1,表示鏈表中沒有這個元素。intlastIndexOf(Objecto)--返回元素在鏈表中最后一次出現(xiàn)的位置,如果返回-1,表示鏈表中沒有這個元素。6.3.2ArrayList類2ArrayList常用方法(7)獲取鏈表大小intsize()--返回鏈表長度(鏈表包含元素的個數(shù))。(6)檢查鏈表是否為空booleanisEmpty()--返回true表示鏈表中沒有任何元素。6.3.2ArrayList類ArrayList主要用法,包括創(chuàng)建鏈表、添加元素、查找元素、替換元素、三種遍歷方法以及轉(zhuǎn)化為數(shù)組等操作。知識應用
按模板方式截圖eclipse內(nèi)的程序,放置于此?6.3.2ArrayList類ArrayList主要用法,包括創(chuàng)建鏈表、添加元素、查找元素、替換元素、三種遍歷方法以及轉(zhuǎn)化為數(shù)組等操作。知識應用
按模板方式截圖eclipse內(nèi)的程序,放置于此?6.3.2ArrayList類ArrayList主要用法,包括創(chuàng)建鏈表、添加元素、查找元素、替換元素、三種遍歷方法以及轉(zhuǎn)化為數(shù)組等操作。運行結(jié)果浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.3.1List接口概述6.3.2ArrayList類6.3.3LinkedList類6.3List接口6.3.3LinkedList類優(yōu)點缺點相對于ArrayList,LinkedList插入是更快的,因為LinkedList不需要改變數(shù)組的大小,也不需要在數(shù)組裝滿的時候要將所有的數(shù)據(jù)重新裝入一個新的數(shù)組。LinkedList需要更多的內(nèi)存,因為ArrayList的每個索引的位置是實際的數(shù)據(jù),而LinkedList中的每個節(jié)點中存儲的是實際的數(shù)據(jù)和前后節(jié)點的位置。LinkedeList和ArrayList都實現(xiàn)了List接口。兩者之間最主要的區(qū)別在于ArrayList是可改變大小的數(shù)組,而LinkedList是雙向鏈接串列。6.3.3LinkedList類
雖然很多場景下ArrayList更受歡迎,但是還有些情況下LinkedList更為合適。譬如:(1)當應用不需要隨機訪問數(shù)據(jù)時:因為如果你需要LinkedList中的第n個元素的時候,你需要從第一個元素順序數(shù)到第n個數(shù)據(jù),然后讀取數(shù)據(jù),這樣的速度比較慢,效率不高。(2)當應用中插入和刪除元素操作多,隨機讀取數(shù)據(jù)操作少時:因為LinkedList中插入和刪除元素不涉及重排數(shù)據(jù),所以它要比ArrayList更快。6.3.3LinkedList類LinkedList新增的特有方法(1)添加首尾元素方法部publicvoidaddFirst(Objecte)—-添加元素到首部。publicvoidaddLast(Objecte)—-添加元素到尾部。(2)獲取首尾元素方法publicObjectgetFirst()—-獲取首部元素。publicObjectgetLast()—-獲取尾部元素。(3)刪除首尾元素方法publicObjectremoveFirst()—-刪除首部元素。publicObjectremoveLast()—-刪除尾部元素。6.3.3LinkedList類LinkedList主要用法,包括如何創(chuàng)建列表、添加元素、刪除元素、遍歷列表等。知識應用
按模板方式截圖eclipse內(nèi)的程序,放置于此?6.3.3LinkedList類LinkedList主要用法,包括如何創(chuàng)建列表、添加元素、刪除元素、遍歷列表等。運行結(jié)果浙江經(jīng)貿(mào)職業(yè)技術(shù)學院案例
6-1單元6集合就診時排隊叫號案例單元Java語言程序設計主講王昌建eclipseeclipseeclipse案例
6-1:就診時排隊叫號案例目標
以患者到醫(yī)院就診為業(yè)務背景,體驗取號和排隊叫號功能的實現(xiàn)機制。案例解釋
就診時按患者的取號先后順序依次叫號,通知當前就診病人的同時提示候診病人的情況。案例效果案例6-1:就診時排隊叫號實現(xiàn)思路基本步驟按實訓要求創(chuàng)建工程并配置環(huán)境創(chuàng)建排隊叫號業(yè)務類(1)在cn.campsg.java.experiment包中創(chuàng)建叫號業(yè)務類,
QueueCaller;(2)為QueueCaller類創(chuàng)建患者排隊列表屬性:ArrayList<String>queue;(3)為QueueCaller類創(chuàng)建0參構(gòu)造器,其形式如下:(+提示:publicQueueCaller(){})1)在構(gòu)造器內(nèi)實例化患者排隊列表(queue)。(4)為QueueCaller類創(chuàng)建獲取患者數(shù)量的方法:(+提示:publicintsize(){})案例效果案例
6-1:就診時排隊叫號實現(xiàn)思路基本步驟創(chuàng)建排隊叫號業(yè)務類(5)實現(xiàn)size方法的業(yè)務邏輯:通過調(diào)用queue對象的size方法,獲取等待就診的人數(shù)。返回等待就診的人數(shù)。(6)為QueueCaller類創(chuàng)建取號方法fetchNumber:(+提示:publicvoidfetchNumber(Stringpatient){})(7)實現(xiàn)fetchNumber方法的業(yè)務邏輯:將患者姓名加入等待隊列queue。輸出患者排隊就診信息,信息如下:patient+"前面還有
"+(size()-1)+"位在等候就診。"案例效果案例
6-1:就診時排隊叫號實現(xiàn)思路基本步驟創(chuàng)建排隊叫號業(yè)務類(8)為QueueCaller類創(chuàng)建顯示候診者信息的方法:(+提示:publicvoidshowPatients(){})(9)實現(xiàn)showPatients方法的業(yè)務邏輯:1)判斷隊列(queue)中是否存在排隊等待患者,如沒有直接退出。2)如存在排隊等待患者,從隊列中獲取該患者的姓名。3)輸出患者信息,內(nèi)容:患者姓名+"候診中"。案例效果案例
6-1:就診時排隊叫號實現(xiàn)思路基本步驟創(chuàng)建排隊叫號業(yè)務類(10)為QueueCaller類創(chuàng)建叫號方法:(+提示:publicvoidcallNumber(){})(11)callNumber方法的業(yè)務邏輯如下;1)移除隊首(隊列第0位成員)患者,并返回患者姓名。2)輸出被叫號的患者信息,信息內(nèi)容:"請患者:"+患者姓名+"到診室就診!"。案例效果案例
6-1:就診時排隊叫號實現(xiàn)思路基本步驟顯示模擬叫號就診情況:(1)在cn.campsg.java.experiment包中創(chuàng)建主類:MainClass;(2)為MainClass創(chuàng)建入口主方法:main。(3)模擬3個患者排隊就診:1)在main方法中,創(chuàng)建1個排隊叫號器(QueueCaller)對象;2)在main方法中,向叫號器對象存入3個患者姓名;+提示QueueCallerqc=newQueueCaller();//創(chuàng)建默認叫號排隊器for(inti=1;i<=3;i++){//取3個號 qc.fetchNumber("張山-"+i);}案例效果案例
6-1:就診時排隊叫號實現(xiàn)思路基本步驟顯示模擬叫號就診情況:(4)模擬叫號:1)在main方法中,循環(huán)叫號直到?jīng)]有就診患者為止。2)每次叫號后均需顯示正在排隊的患者信息。+提示while(qc.size()!=0){ qc.callNumber(); qc.showPatients();//顯示候診信息}浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.5.1Map接口概述6.5.2Map存儲對象原理6.5.3HashMap類6.5Map接口6.5.1Map接口概述Java中的Map接口是和Collection接口同一等級的集合根接口,它表示一個鍵值對(key-value)的映射。010203Map用于保存具有映射關(guān)系的數(shù)據(jù),因此Map集合里保存著兩組值,一組值用于保存Map里的key,另外一組值用于保存Map里的value,key和value都可以是任何引用類型的數(shù)據(jù)。Map的key不允許重復,即同一個Map對象的任何兩個key通過equals方法比較總是返回false。key和value之間存在單向一對一關(guān)系,即通過指定的key總能找到唯一的、確定的value,即每一個鍵最多只能映射到一個值。注意點6.5.1Map接口概述HashMapTreeMapLinkedHashMap1243Map接口常用實現(xiàn)類HashTable6.5.1Map接口概述Map接口的主要方法(1)添加元素功能Vput(Kkey,Vvalue)--添加元素,如果鍵是第一次存儲,就直接存儲元素,返回null;如果鍵不是第一次存儲,之前已經(jīng)存在,就用值把以前的值替換掉并返回以前的值。(2)刪除元素功能voidclear()--移除所有的鍵值對元素。Vremove(Objectkey)--根據(jù)鍵刪除鍵值對元素,并把值返回。6.5.1Map接口概述Map接口的主要方法(3)判斷功能booleancontainsKey(Objectkey)--判斷集合是否包含指定的鍵。booleancontainsValue(Objectvalue)--判斷集合是否包含指定的值。booleanisEmpty()--判斷集合是否為空。(4)獲取元素功能Vget(Objectkey)--根據(jù)鍵獲取值。Set<K>keySet()--獲取集合中所有鍵的集合。Collection<V>values()--獲取集合中所有值的集合。intsize()--返回集合中的鍵值對的個數(shù)。浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.5.1Map接口概述6.5.2Map存儲對象原理6.5.3HashMap類6.5Map接口6.5.2Map存儲對象原理1Map的數(shù)據(jù)結(jié)構(gòu)
Map的數(shù)據(jù)結(jié)構(gòu)Map是一種容器,可以用來進行數(shù)據(jù)或?qū)ο蟮拇鎯?,擁有自己獨特的?shù)據(jù)結(jié)構(gòu)。Map的每一個元素叫做鍵值對,所謂鍵值對其實就是“鍵”和“值”組成的一對。Map的每一個元素由兩部分組成,分別是:key(鍵)和value(值)。
Map的存取操作容器是用來裝東西的,那么容器就要有對應的存取操作。對于“取東西”,也就是查找操作,與數(shù)組和鏈表一樣,Map在查找元素時也有自己的規(guī)則,這里Map通過查找key(鍵)的方式,來獲取相應的value(值),并且key的值不可以重復,這一點與數(shù)組中的下標相似。6.5.2Map存儲對象原理2Map的底層實現(xiàn)原理
Map的底層實現(xiàn)Map的底層實現(xiàn)基礎是我們學過的數(shù)組和鏈表,因為Map的數(shù)據(jù)結(jié)構(gòu)問題,Map中的各個元素之間沒有連接的關(guān)系,所以通過數(shù)組的方式存儲Map的每個元素。
當然Map既然是與數(shù)組和鏈表不同的容器,他自然也有自己的優(yōu)點。Map同其他容器一樣,也有自己的增、刪、改對應的操作,Map的新增方法叫做put,查找方法叫做get。6.5.2Map存儲對象原理2Map的底層實現(xiàn)原理//用程序模擬Map存儲數(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;}//接下一頁程序首先定義了一個類MyMap,并為該類定義了私有屬性key和value,并定義了一個與類相同類型的數(shù)組,初始大小為100。然后添加一個賦初值的構(gòu)造方法和一個無參構(gòu)造方法。定義類的成員變量和構(gòu)造方法定義一個put方法,實現(xiàn)根據(jù)傳入的參數(shù)key和value創(chuàng)建一個類的對象并加入數(shù)組中,然后使得表示數(shù)組下標的參數(shù)size加1,從而實現(xiàn)了將給定的key和value保存到Map中的功能。定義put方法6.5.2Map存儲對象原理2Map的底層實現(xiàn)原理//接上一頁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)來實現(xiàn)key與myMap數(shù)組中存儲的元素的key進行比較,如果相等則返回該元素的value,如果沒有匹配項則返回null,從而實現(xiàn)了對Map的取值操作。定義get方法編寫了一個主方法,對該類進行了測試,程序運行效果如預期一致,可以將任何類型的key和value進行存儲,并能夠根據(jù)key的值再從Map中獲取并輸出。主方法測試浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.5.1Map接口概述6.5.2Map存儲對象原理6.5.3HashMap類6.5Map接口6.5.3HashMap類HashMap是基于哈希表的Map接口的實現(xiàn)。010203在HashMap中,key-value總是會當做一個整體來處理,系統(tǒng)會根據(jù)hash算法來計算key-value的存儲位置,可以通過key快速地存取value,因此HashMap在添加和刪除映射關(guān)系時的效率更高。HashMap允許使用null值和null鍵,但必須保證鍵的唯一性。HashMap通過哈希表對其內(nèi)部的映射關(guān)系進行快速查找,但HashMap不能保證映射的順序。注意點6.5.3HashMap類TreeMap是Map接口的另外一個實現(xiàn)類。如果希望Map集合中的對象也存在一定的順序則應該選擇使用TreeMap。010203TreeMap中的映射關(guān)系存在一定的順序。TreeMap不允許null鍵。TreeMap添加、刪除操作時性能稍差。注意點浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計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)遍歷遍歷者自己在集合外部維護一個計數(shù)器,然后依次讀取每一個位置的元素,當讀取到最后一個元素后停止,主要就是需要按元素的位置來讀取元素,這也是最原始的集合遍歷方法。以List的遍歷為例,其格式為:for(inti=0;i<list.size();i++){list.get(i);}6.6.1遍歷集合的方法1集合的遍歷方法
Iterator迭代器遍歷
Iterator本來是面向?qū)ο蟮囊粋€設計模式,主要目的就是屏蔽不同數(shù)據(jù)集合的特點進行統(tǒng)一遍歷集合的接口。Java作為一個面向?qū)ο笳Z言,自然也在Collection中支持了Iterator模式。以List的遍歷為例,其格式為:Iteratoriterator=list.iterator();while(iterator.hasNext()){……iterator.next();}6.6.1遍歷集合的方法1集合的遍歷方法
For-Each循環(huán)遍歷
For-Each循環(huán)也叫增強型的for循環(huán)或者叫foreach循環(huán)。foreach循環(huán)避免了顯式地聲明Iterator和計數(shù)器,具有代碼簡潔、不易出錯的優(yōu)點,但是這種方法只能做簡單的遍歷,不能在遍歷過程中進行刪除、替換數(shù)據(jù)等操作。。以List的遍歷為例,其格式為:for(ElementTypeelement:list){……}6.6.1遍歷集合的方法2Map的遍歷方法
由于Java中的所有Map都實現(xiàn)了Map接口,因此以下方法適用于任何Map的實現(xiàn)類,例如HashMap、TreeMap、LinkedHashMap、Hashtable等。
下面以一個整數(shù)類的HashMap(HashMap<Integer,Integer>)為例進行說明。6.6.1遍歷集合的方法2Map的遍歷方法
在foreach循環(huán)中使用entries遍歷
這是最常見的并且在大多數(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中的鍵或者值,可以通過keySet或values來實現(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的唯一方式。遍歷時調(diào)用iterator.remove()來刪除entries,前面兩個方法則不能。從性能方面看,該方法類同于foreach遍歷的性能。優(yōu)點6.6.1遍歷集合的方法2Map的遍歷方法
通過鍵找值遍歷Map<Integer,Integer>map=newHashMap<Integer,Integer>();for(Integerkey:map.keySet()){Integervalue=map.get(key);System.out.println("Key="+key+",Value="+value);}注意:該方法代碼簡潔但實際上效率較低,因為從鍵取值是耗時的操作,所以盡量避免使用浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.6.1遍歷集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代與比較6.6.2使用Iterator迭代器6.6.2使用Iterator迭代器
迭代器迭代器是一種設計模式,它是一個對象,它可以遍歷并選擇序列中的對象,而開發(fā)人員不需要了解該序列的底層結(jié)構(gòu)。
迭代器通常被稱為“輕量級”對象,因為創(chuàng)建它的代價小。
Iterator迭代器Java中的Iterator功能比較簡單,并且只能單向移動。6.6.2使用Iterator迭代器要求容器返回一個Iterator。Iiterator()方法獲得序列中的下一個元素,第一次調(diào)用時返回序列的第一個元素。next()方法檢查序列中是否還有元素。hasNext()方法將迭代器新返回的元素刪除。remove()方法Iterator迭代器常用的方法6.6.2使用Iterator迭代器
迭代器應用實例代碼。知識應用浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計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)部定義的方法實現(xiàn)的排序,位于java.lang包。Comparator是在集合外部實現(xiàn)的排序,位于java.util包。6.6.3Comparable接口
類的自然排序和自然比較方法
Comparable接口強行對實現(xiàn)它的每個類的對象進行整體排序,此排序稱為該類的自然排序。
類的compareTo()方法被稱為它的自然比較方法。010203實現(xiàn)此接口的對象集合可以通過Collections.sort()進行自動排序。實現(xiàn)此接口的對象數(shù)組則可以通過Arrays.sort()進行自動排序。實現(xiàn)此接口的對象可以用作有序映射表中的鍵或有序集合中的元素,無需指定比較器。注意點6.6.3Comparable接口
在成績排序中一般要求先按成績(score)從高到底進行排序,如果成績相同則按年齡(age)從低到高進行排序。
使用Comparable接口實現(xiàn)該功能。知識應用浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.6.1遍歷集合的方法6.6.3Comparable接口6.6.4Comparator接口6.6迭代與比較6.6.2使用Iterator迭代器6.6.4Comparator接口0102Comparable接口的compareTo(To)方法只有一個參數(shù)。Comparator接口中必須要被實現(xiàn)的compare(To1,To2)方法則包含兩個參數(shù)。注意點
如果在設計類的時候沒有考慮到讓類實現(xiàn)Comparable接口,那么就需要用到比較器接口Comparator。6.6.4Comparator接口
在成績排序中一般要求先按成績(score)從低到高進行排序,如果成績相同則按年齡(age)從高到低進行排序。
使用Comparator接口實現(xiàn)該功能。知識應用浙江經(jīng)貿(mào)職業(yè)技術(shù)學院案例
6-2單元6集合消費抽獎案例單元Java語言程序設計主講王昌建eclipseeclipseeclipse案例
6-2:消費抽獎案例目標案例解釋
以現(xiàn)實生活中的消費抽獎為業(yè)務背景,體驗Map的實際應用。
程序設置四種獎項,分為特定獎1個,一等獎4個,二等獎6個,陽光普照獎100個。每次抽中一個獎項后,對應獎項的總獎品數(shù)量減少一個。案例效果案例
6-2:消費抽獎實現(xiàn)思路基本步驟1.按實訓要求創(chuàng)建工程并配置環(huán)境2.創(chuàng)建獎項實體類:(1)在cn.campsg.java.experiment.entity包中創(chuàng)建獎項類:Awards;(2)為Awards類定義私有屬性:name和count,并添加getter和setter方法(3)為Awards類創(chuàng)建默認的0參構(gòu)造器。(4)為Awards類創(chuàng)建2參構(gòu)造器,實現(xiàn)對成員變量的賦值。案例效果案例
6-2:消費抽獎實現(xiàn)思路基本步驟3.創(chuàng)建抽獎業(yè)務類:(1)在cn.campsg.java.experiment.entity包中創(chuàng)建抽獎業(yè)務類DrawReward;(2)為DrawReward類創(chuàng)建代表獎池的私有屬性rwdPool(3)為DrawReward類創(chuàng)建默認的0參構(gòu)造器,并實例化獎池對象并在獎池中添加四種獎項。(4)為DrawReward類創(chuàng)建抽獎方法:draward(5)為DrawReward類創(chuàng)建顯示剩余獎項信息方法showSurplus案例效果案例
6-2:消費抽獎實現(xiàn)思路基本步驟4.顯示模擬抽獎結(jié)果(1)在包cn.campsg.java.experiment中創(chuàng)建業(yè)務主類:MainClass;(2)在MainClass中定義程序入口主方法:main;(3)在main方法中,創(chuàng)建1個抽獎對象:DrawRewarddraw=newDrawReward();(4)在main方法中,隨機生成抽獎號,模擬10次抽獎;(5)在main方法中,調(diào)用showSurplus,展示獎池的剩余獎品信息。浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計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對XML解析的Stream。也不同于AmazonKinesis對大數(shù)據(jù)實時處理的Stream。StreamAPI更像集合類,但行為和集合類又有所不同,它是對集合對象功能的增強,專注于對集合對象進行各種非常便捷、高效的聚合操作或大批量數(shù)據(jù)操作6.8.1Stream概述
SteamAPI
StreamAPI引入的目的在于彌補Java函數(shù)式編程的缺陷,總體來講仍然是非常完善和強大,足以用很少的代碼完成許多復雜的功能。StreamAPI充分利用Lambda表達式的特性,極大地提高編程效率和程序可讀性。StreamAPI提供串行和并行兩種模式進行匯聚操作,并發(fā)模式能夠充分利用多核處理器的優(yōu)勢,使用Fork/Join并行方式來拆分任務和加速處理過程。Java8中首次出現(xiàn)的java.util.Stream,是一個函數(shù)式語言+多核時代綜合影響的產(chǎn)物。6.8.1Stream概述Stream不是集合元素,它不是數(shù)據(jù)結(jié)構(gòu)并不保存數(shù)據(jù),它是有關(guān)算法和計算的,它更像一個高級版本的Iterator。0102原始版本的Iterator用戶只能顯式地一個一個遍歷元素并對其執(zhí)行某些操作。高級版本的Stream,用戶只要給出需要對其包含的元素執(zhí)行什么操作,比如“過濾掉長度大于10的字符串”、“獲取每個字符串的首字母”等,Stream會隱式地在內(nèi)部進行遍歷,做出相應的數(shù)據(jù)轉(zhuǎn)換。6.8.1Stream概述相同點不同點Stream就如同一個迭代器(Iterator),單向不可往復,數(shù)據(jù)只能遍歷一次,遍歷過一次后即用盡。Stream可以并行化操作,迭代器只能命令式地、串行化操作。Stream的并行操作依賴于Java7中引入的Fork/Join框架來拆分任務和加速處理過程。浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.8.1Stream概述6.8.3List新增方法6.8StreamAPI(新特性)6.8.2創(chuàng)建并使用Stream6.8.2創(chuàng)建并使用Stream
在StreamAPI中,一個流基本上代表一個元素序列,StreamAPI提供了豐富的操作函數(shù)來計算這些元素。StreamAPI使用Lambda表達式和其它函數(shù)進行抽象,可以使得代碼更易于理解、更為干凈。有了這些抽象,還可以做一些優(yōu)化,比如實現(xiàn)并行等。6.8.2創(chuàng)建并使用Stream123獲取一個數(shù)據(jù)源(Source)數(shù)據(jù)轉(zhuǎn)換執(zhí)行操作獲取想要的結(jié)果使用一個流的三個基本步驟
每次轉(zhuǎn)換時原有Stream對象不改變,返回一個新的Stream對象(可以有多次轉(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
一個流可以后面跟隨零個或多個Intermediate操作,其目的主要是打開流,做出某種程度的數(shù)據(jù)映射/過濾,然后返回一個新的流,交給下一個操作使用。這類操作都是惰性化的(lazy),就是說,僅僅調(diào)用到這類方法,并沒有真正開始流的遍歷。(2)Terminal一個流只能有一個Terminal操作,當這個操作執(zhí)行后,流就被使用“光”了,無法再被操作。所以這必定是流的最后一個操作。執(zhí)行Terminal操作才會真正開始流的遍歷,并且會生成一個結(jié)果。6.8.2創(chuàng)建并使用Stream2流的操作類型(3)Short-circuiting
當操作一個無限大的Stream,而又希望在有限時間內(nèi)完成操作,則擁有一個Short-circuiting操作是必要非充分條件。例如:對于一個Intermediate操作,如果它接受的是一個無限大的Stream,但返回一個有限的新Stream,或者對于一個Terminal操作,如果它接受的是一個無限大的Stream,但要求能在有限的時間計算出結(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的簡單應用實例。
實現(xiàn)了從Student類實例列表中進行篩選、列表元素數(shù)量獲取、整形數(shù)據(jù)流IntStream的獲取和使用等
知識應用浙江經(jīng)貿(mào)職業(yè)技術(shù)學院集合Java語言程序設計Unit6主講王昌建6.8.1Stream概述6.8.3List新增方法6.8StreamAPI(新特性)6.8.2創(chuàng)建并使用Stream6.8.3List新增方法返回值類型方法名稱和參數(shù)方法說明Stream<E>stream()從集合數(shù)據(jù)源中創(chuàng)建一個連續(xù)的流Stream<E>parallelStream()從集合數(shù)據(jù)源中創(chuàng)建一個并行的流對于流的操作,集合類的頂級接口Collection中新增了兩個方法:6.8.3List新增方法
stream()方法示例作用:以list為數(shù)據(jù)源創(chuàng)建一個連續(xù)的Student對象的流。以List為例,代碼:Stream<Student>stream=list.stream()6.8.3List新增方法
parallelStream()方法示例作用:第一行代碼實現(xiàn)創(chuàng)建一個存儲Integer類型元素的列表,第二行代碼則展示了利用列表進行并行的輸出操作,因而輸出顯示的順序不一定會是1、2、3、4、5、6、7、8、9,而可能是任意的順序,這就是并行流的作用效果。對于并行流的操作,觀察兩行代碼: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ù)學院集合Java語言程序設計Unit6主講王昌建6.9.1泛型的作用6.9.3自定義泛型6.9.4類型通配符6.9泛型6.9.2集合與泛型6.9.1泛型的作用
泛型的機制泛型是一種參數(shù)化類型的機制,它可以使得代碼適用于各種類型,從而編寫更加通用的代碼,例如集合框架。泛型是一種編譯時類型確認機制,提供了編譯期的類型安全,確保在泛型類型(通常為泛型集合)上只能使用正確類型的對象,避免了在運行時出現(xiàn)ClassCastException。泛型的正常工作是依賴編譯器在編譯源碼的時候,先進行類型檢查,然后進行類型擦除并且在類型參數(shù)出現(xiàn)的地方插入強制轉(zhuǎn)換的相關(guān)指令實現(xiàn)的。6.9.1泛型的作用下面以一個簡單的例子介紹泛型。先看下面的代碼:Listlist=newArrayList();list.add("zjiet");list.add(100);for(inti=0;i<list.si
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人租車合同范本
- 承接高空吊裝合同范本
- 古代租房合同范本
- 司機勞務合同范本簡單
- 股權(quán)質(zhì)押登記合同范本
- 加工店鋪轉(zhuǎn)讓合同范本
- 裝修居間合同范本
- 監(jiān)控施工改造合同范本
- 政府采購業(yè)務合同范本
- 標準的工程合同范本
- 公共圖書館管理服務合同
- 電商退換貨流程標準操作手冊
- 2025年法檢系統(tǒng)書記員招聘考試(申論)歷年參考題庫含答案詳解(5套)
- 2025年幼兒園教師《指南》《幼兒教師專業(yè)標準》學習測試題(附答案)
- (2025年標準)夜市經(jīng)營協(xié)議書
- 加油站雷電安全知識培訓課件
- 辦公自動化使用教材課件
- 陜西省特種設備隱患排查清單(2025年)
- 最新版?zhèn)€人征信報告(可編輯+帶水印)
- 國際貿(mào)易實務英文版第五版ppt課件(完整版)
- 隧道穿越大型活動斷裂帶的技術(shù)對策
評論
0/150
提交評論