單元9 集合電子課件_第1頁
單元9 集合電子課件_第2頁
單元9 集合電子課件_第3頁
單元9 集合電子課件_第4頁
單元9 集合電子課件_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單元九集合集合的概述Collection集合List集合Set集合Map集合泛型Java集合可以在程序設(shè)計中實現(xiàn)傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu),是一個用來存儲對象的容器,也就是說集合中只能存儲對象,如果向集合中加入基本類型數(shù)據(jù),系統(tǒng)會將其自動裝箱后存入集合。集合可存儲不同數(shù)據(jù)類型元素,集合的長度可改變。本單元的學(xué)習(xí)目標(biāo)如下。單元九集合教學(xué)目標(biāo)知識目標(biāo):技能目標(biāo):素養(yǎng)目標(biāo):掌握常用集合類的功能熟悉List集合、Set集合和Map集合的區(qū)別掌握集合遍歷的方法能夠恰當(dāng)運用Java集合能夠正確Java集合的相關(guān)類能夠獨立完成拓展任務(wù)懂得只有功夫深,鐵杵磨成針的道理明白擁有怎樣的認知,就會擁有怎樣的財富的意義掌握集合中泛型的使用9.1知識儲備–集合的概述Java集合也稱為容器,用來在java.util包下存儲Java類的對象。某一個對象一旦被放入集合,其類的信息將丟失,也就是說集合內(nèi)存儲的對象都是Object類型的。Object類是所有類的父類,因此,集合可存儲任意類型的對象,這一特點同時也會帶來不便,如當(dāng)獲取集合中元素時,需要使用強制類型轉(zhuǎn)換將其類型轉(zhuǎn)換為指定的數(shù)據(jù)類型。9.1.1集體的概述Java集合分為Collection集合(單列集合)和Map集合(雙列集合)。Collection集合為根接口,常用的子接口有List集合、Queue集合和Set集合,List集合常用的實現(xiàn)類有ArrayList集合和LinkedList集合,Set集合常用的實現(xiàn)類有HashSet集合和TreeSet集合。Map集合常用的實現(xiàn)類有HashMap集合和TreeMap集合,HashMap集合常用的子類有LinkedHashMap集合。集合的繼承關(guān)系如圖9-1所示。Collection集合(單列集合)Map集合(雙列集合)List集合Set集合ArrayList實現(xiàn)類LinkedList實現(xiàn)類HashSet實現(xiàn)類TreeSet實現(xiàn)類HashMap實現(xiàn)類TreeMap實現(xiàn)類LinkedHashMap子類9.1.1集體的概述Java中的數(shù)組可以保存多個數(shù)據(jù)元素,且數(shù)組元素類型必須相同,數(shù)組長度不能改變,但在實際應(yīng)用中很多情況下,元素類型及元素的個數(shù)無法確定,集合的誕生可以解決此類問題,集合的長度可變,集合元素的數(shù)據(jù)類型可不相同。Java的集合在java.util包下,用來存儲Java類的對象。某一個對象一旦被放入集合,其類的信息將丟失,也就是說集合內(nèi)存儲的對象都是Object類型對象,Object類是所有類的父類,因此,集合中可容納任意類型的對象,這一特點同時也會帶來不便,當(dāng)獲取集合中元素時,需要使用強制類型轉(zhuǎn)換將其轉(zhuǎn)換為指定的數(shù)據(jù)類型。9.1.1集體的概述9.1知識儲備–Collection集合

List集合Queue集合

Set集合Collection集合是單列集合的根接口,用于存儲一系列符合某種規(guī)則的元素,其子接口有List集合、Queue集合和Set集合。List集合的特點是元素有序且可重復(fù),Queue集合的特點是隊列先進先出,Set集合的特點是元素?zé)o序且不可重復(fù)。我們重點學(xué)習(xí)List集合和Set集合。Collection集合定義了一些常用的方法,通過這些方法可以實現(xiàn)對集合的基本操作,Collection集合常用方法如表9-1所示。9.1.2Collection集合方法聲明方法描述booleanadd(Ee)向集合中添加一個元素booleanaddAll(Collectionc)將指定集合中的所有元素添加到集合中voidclear()清除集合中所有元素booleancontains(Objecto)判斷集合中是否存在指定元素booleancontainsAll(Collectionc)判斷集合中是否包含集合c中的所有元素booleanisEmpty()判斷集合是否為空Iterator<E>iterator()返回一個Iterator對象,用于遍歷集合中的元素booleanremove(Objecto)從集合中刪除第一個符合條件的元素booleanremoveAll(Collectionc)從集合中刪除所有集合c的元素intsize()返回集合中元素的個數(shù)表9-1Collection集合常用方法9.1.2Collection集合9.1知識儲備–List集合

ArrayList類LinkedList類List集合繼承了Collection集合,List集合可以對集合中的每個元素進行精確的控制,根據(jù)元素的索引來獲取元素的值。List集合中的元素是有序的,即添加和刪除元素的順序是相同的;List集合中的元素是可重復(fù)的,即可同時出現(xiàn)多個相同的元素,通過索引來訪問指定位置的元素。List集合默認按元素的添加順序設(shè)置元素的索引,第一個添加到List集合中的元素的索引為0,第二個索引為1,依此類推。List集合除了繼承Collection集合的方法外,還添加了一些根據(jù)索引操作元素的方法,List集合常用方法如表9-2所示。9.1.3List集合9.1.3List集合方法聲明方法描述voidadd(intindex,Eelement)在集合中指定的位置上插入指定的元素booleanaddAll(Collectionc)追加指定集合的所有元素到該集合的末尾booleanaddAll(intindex,Collectionc)將指定集合中的所有元素插入到該集合指定位置voidclear()從集合中移除所有的元素Objectget(intindex)返回此集合中指定位置的元素intindexOf(Objecto)返回集合中指定元素的第一個出現(xiàn)的索引值,如果指定元素不存在,返回-1。intlastIndexOf(Objecto)返回集合中指定元素的最后一次出現(xiàn)的索引值,如果指定元素不存在,返回-1。ListsubList(intfromIndex,inttoIndex)返回一個從索引fromIndex(包含)到索引toIndex(不包含)所有元素組成的子集合表9-2List集合常用方法List集合除了繼承Collection集合的方法外,還添加了一些根據(jù)索引操作集合元素的方法,常用List集合方法見表9-2。List集合常用的實現(xiàn)類有ArrayList集合和LinkedList集合。1.ArrayList集合ArrayList集合內(nèi)部封裝了可變長度的數(shù)組對象,當(dāng)添加的元素長度超過默認長度時,ArrayList集合會在內(nèi)存中分配一個長度更長的數(shù)組來存儲這些元素。ArrayList集合提供3個常用構(gòu)造方法,如表9-3所示。9.1.3List集合構(gòu)造方法聲明構(gòu)造方法描述ArrayList()構(gòu)造一個初始化容量為10的空列表ArrayList(Collectionc)構(gòu)造一個包含指定collection元素的列表ArrayList(intinitialCapacity)構(gòu)造一個指定初始容量的空列表ArrayList提供3個構(gòu)造方法,見表9-3。表9-3ArrayList集合構(gòu)造方法ArrayList的方法大部分是從List集合和Collection集合繼承而來,通過這些方法可以實現(xiàn)對集合元素的添加、刪除、修改和獲取等操作。9.1.3List集合【例9-1】使用ArrayList向集合中添加三名學(xué)生信息,包括學(xué)號、性別和姓名,然后遍歷集合輸出這些學(xué)生信息。操作步驟:(1)新建unit09工程,在工程unit09的src目錄下創(chuàng)建包.cvit.list,在包.cvit.list下創(chuàng)建類Student。(2)在Student.java文件中,定義成員變量,分別為id(學(xué)號),name(姓名)和gender(性別),創(chuàng)建無參構(gòu)造方法和有參構(gòu)造方法,重寫toString方法,Student.java文件代碼如下:9.1.3List集合package.cvit.list;

/**

*Student類

*/

publicclassStudent{

privateStringid;

privateStringname;

privateStringgender;

publicStudent(){

}

publicStudent(Stringid,Stringname,Stringgender){

this.id=id;

this.name=name;

this.gender=gender;

}……

……

publicStringgetId(){

returnid;

}

publicvoidsetId(Stringid){

this.id=id;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicStringgetGender(){

returngender;

}

publicvoidsetGender(Stringgender){

this.gender=gender;

}

@Override

publicStringtoString(){

return"學(xué)號:"+id+",姓名:"+name+",性別:"+gender;

}

}Student.java文件代碼:9.1.3List集合(3)在.cvit.list包下創(chuàng)建測試類ArrayListDemo。在ArrayListDemo.java文件中,定義main()方法,在main()方法中實例化ArrayList對象,分別向ArrayList對象添加3個學(xué)生對象,遍歷輸出ArrayList對象中所有元素,ArrayListDemo.java文件代碼如下:9.1.3List集合package.cvit.list;

importjava.util.ArrayList;

/**

*ArrayList集合

*/

publicclassArrayListDemo{

publicstaticvoidmain(String[]args){

ArrayListlist=newArrayList();

//實例化ArrayList對象

list.add(newStudent("001","Tony","男"));

//向ArrayList對象中添加3個學(xué)生對象元素

list.add(newStudent("002","Alice","女"));

list.add(newStudent("003","Rose","女"));

for(inti=0;i<list.size();i++){

//遍歷ArrayList對象,輸出3個學(xué)生基本信息

System.out.println(list.get(i));

}

}

}ArrayListDemo.java文件代碼:9.1.3List集合(4)在文本編輯器視圖中,單擊運行“”按鈕,運行結(jié)果如圖9-2所示。9.1.3List集合提示:可以向ArrayList對象中添加重復(fù)的數(shù)據(jù),也可以添加其它類型數(shù)據(jù)。集合元素的索引號從0到集合的大小減1。ArrayList集合在使用時需要導(dǎo)入java.util.ArrayList包,在IDEA中,快速導(dǎo)包的方法就是將光標(biāo)移至ArrayList上,按照系統(tǒng)提示,按Alt+Enter鍵即,如圖9-3所示。9.1.3List集合2.LinkedList類ArrayList類內(nèi)部封裝的是可變長數(shù)組,可快速搜索指定元素,在文件尾部添加和刪除元素速度也比較快,但是,在任意位置插入和刪除元素速度相對較慢,List集合的另外一個實現(xiàn)類LinkedList可以彌補ArryaList的不足。LinkedList類采用鏈表結(jié)構(gòu)保存對象,占用的內(nèi)存空間比較大,其優(yōu)點是便于向集合中插入或者刪除元素。如果需要頻繁向集合中插入和刪除元素時,選擇LinkedList類,其效率遠高于ArrayList類,但是LinkedList類隨機訪問元素的速度相對較慢,因此,如果需要大量訪問集合元素時,可選用ArrayList類。9.1.3List集合LinkedList類提供了2個構(gòu)造方法,見表9-4。表9-4LinkedList類構(gòu)造方法構(gòu)造方法聲明構(gòu)造方法描述LinkedList()構(gòu)造一個LinkedList的空列表LinkedList(Collectionc)構(gòu)造一個包含指定collection元素的列表9.1.3List集合LinkedList類除了繼承了List集合和Collection集合的方法外,還提供了一些特有的方法,見表9-5。表9-5LinkedList類常用方法方法聲明方法描述voidaddFirst(Ee) 將指定元素添加到集合的開頭voidaddLast(Ee) 將指定元素添加到集合的末尾ObjectgetFirst() 返回集合的第一個元素ObjectgetLast() 返回集合的最后一個元素ObjectremoveFirst()刪除集合中的第一個元素ObjectremoveLast()刪除集合中的最后一個元素9.1.3List集合【例9-2】使用LinkedList類向集合添加不同種類面包的銷售排名,并按照銷售額排名,輸出第一名和最后一名。操作步驟:(1)在包.cvit.list下創(chuàng)建類LinkedListDemo。(2)在LinkedListDemo.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:9.1.3List集合9.1.3List集合package.cvit.list;

importjava.util.LinkedList;

/**

*LinkedList集合

*/

publicclassLinkedListDemo{

publicstaticvoidmain(String[]args){

LinkedListlink=newLinkedList();

//實例化LinkedList集合對象

link.add("豆沙面包");

link.add("椰蓉面包");

link.add("全麥低糖面包");

link.add("提子面包");

link.addFirst("老式雜糧面包");

//向集合插入第一個元素

System.out.println("所有種類面包銷售排名:");

for(inti=0;i<link.size();i++){

//遍歷集合

System.out.print(link.get(i)+"");

}

System.out.println("\n銷售排名第一的面包:"+link.getFirst());

System.out.println("銷售排名最后的面包:"+link.getLast());

}

}(4)在文本編輯器視圖中,單擊運行“”按鈕,運行結(jié)果如圖9-4所示。9.1.3List集合提示:通過LinkedList特有的方法,可以快速地添加、修改、刪除第一個元素和最后一個元素。LinkedList的元素是有序的,可重復(fù)的。9.1知識儲備–Iterator接口

Iterator常用方法Iterator的應(yīng)用Iterator接口是Java迭代器,用于遍歷集合,Iterator不是集合,是用于訪問集合的方法。Iterator對象的使用依賴于集合對象,可通過集合對象的iterator()方法來獲取Iterator對象。Iterator接口常用方法見表9-6。表9-6Iterator接口常用方法方法聲明方法描述booleanhasNext()如果被迭代的集合還有下一個元素,則返回trueObjectnext()返回迭代中的下一個元素defaultvoidremove()刪除集合中上一個next()方法返回的元素9.1.4Iterator接口【例9-3】編寫一個程序,使用Iterator遍歷集合。操作步驟:(1)在工程的src目錄下創(chuàng)建包.cvit.iterator,在.cvit.iterator包下創(chuàng)建類IteratorDemo。(2)在IteratorDemo.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:9.1.4Iterator接口package.cvit.iterator;

importjava.util.ArrayList;

importjava.util.Iterator;

/**

*Iterator遍歷集合

*/

publicclassIteratorDemo{

publicstaticvoidmain(String[]args){

ArrayListlist=newArrayList();

//實例化一個ArrayList集合對象

list.add("byte");

//分別向集合添加Java基本數(shù)據(jù)類型說明符

list.add("short");

list.add("int");

list.add("long");

list.add("char");

list.add("float");

list.add("double");

list.add("boolean");

Iteratorit=list.iterator();

//通過集合對象的iterator()方法獲取Iterator對象

System.out.println("Java基本數(shù)據(jù)類型說明符如下:");

while(it.hasNext()){

//遍歷集合,hasNext()方法--判斷集合是否有下一個元素

Objectobj=it.next();

//next()方法--獲取集合中下一個元素

System.out.print(obj+"");

}

}

}9.1.4Iterator接口(4)在文本編輯器視圖中,單擊運行按鈕,運行結(jié)果如圖9-5所示。

提示:Iterator接口屬于集合中的一員,只能用于遍歷集合,不能集合之外的其它地方。Iterator接口遍歷集合時,while循環(huán)條件是Iterator對象的hasNext(),直到集合中沒有下一個元素,結(jié)束循環(huán)。9.1.4Iterator接口9.1.4Iterator接口【例9-4】使用Iterator迭代器刪除集合元素。操作步驟:(1)在包.cvit.iterator下創(chuàng)建類IteratorRemove。(2)在IteratorRemove.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:/**

*通過Iterator對象刪除集合元素

*/

publicclassIteratorRemove{

publicstaticvoidmain(String[]args){

ArrayListlist=newArrayList();

//實例化一個ArrayList集合對象

list.add("byte");

//分別向集合添加Java基本數(shù)據(jù)類型說明符

list.add("short");

list.add("int");

list.add("long");

list.add("char");

list.add("float");

list.add("double");

list.add("boolean");

Iteratorit=list.iterator();

//通過集合對象的iterator()方法獲取Iterator對象

while(it.hasNext()){

//使用Iterator迭代器遍歷集合

Stringobj=(String)it.next();

if("short".equals(obj)){

//判斷集合元素是否為short,是使用remove()方法刪除該元素

it.remove();

}

}

System.out.println("Java基本數(shù)據(jù)類型說明符(除short之外)如下:");

System.out.print(list);

}

}9.1.4Iterator接口(4)在文本編輯器視圖中,單擊運行按鈕,運行結(jié)果如圖9-6所示。

提示:Iterator對象刪除集合元素后,需要再遍歷輸出,才能看出效果。直接輸出集合對象時,輸出的所有集合元素用方括號括起來。9.1.4Iterator接口9.1知識儲備–foreach循環(huán)

foreach循環(huán)格式

foreach循環(huán)的應(yīng)用雖然通過for循環(huán)和Iterator迭代器都可以遍歷集合,但相對比較繁瑣,foreach循環(huán)也稱為增強for循環(huán),可以更簡單地實現(xiàn)集合遍歷。foreach循環(huán)不僅可以遍歷集合,還可以遍歷數(shù)組。foreach循環(huán)的一般格式:for(容器中元素類型臨時變量:容器變量){

代碼塊}其中,容器可以是數(shù)組,也可以是集合,臨時變量代表容器元素,容器變量是數(shù)組對象或者集合對象。9.1.5foreach循環(huán)【例9-5】編寫程序,使用foreach遍歷集合。操作步驟:(1)在工程的src目錄下創(chuàng)建包.cvit.foreach,在包.cvit.foreach下創(chuàng)建類ForeachDemo。(2)在ForeachDemo.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:9.1.5foreach循環(huán)package.cvit.foreach;

importjava.util.ArrayList;

/**

*foreach循環(huán)遍歷集合

*/

publicclassForeachDemo{

publicstaticvoidmain(String[]args){

ArrayListlist=newArrayList();

list.add("Tony");

list.add("Alice");

list.add("Tom");

System.out.print("集合元素有:");

//foreach遍歷集合,Object--集合元素類型,O--集合元素變量,list--集合變量

for(Objecto:list){

System.out.print(o+"\t");

}

}

}

9.1.5foreach循環(huán)(4)在文本編輯器視圖中,單擊運行按鈕,運行結(jié)果如圖9-7所示。

提示:在IDEA中,快速書寫foreach的方法輸入iter加回車鍵,或者iter加tab鍵。

foreach循環(huán)遍歷集合時,只能訪問集合中的元素,不能刪除集合元素。9.1.5foreach循環(huán)9.1知識儲備–Set集合

HashSet類TreeSet類Set集合同樣繼承了Collection集合,Set集合中的元素?zé)o序、不重復(fù),且最多只能包含一個null元素,Set集合的常用實現(xiàn)類有HashSet和TreeSet。Set集合的常用方法與Collection集合基本相同。1. HashSet類HashSet是Set集合的典型實現(xiàn)類,HashSet是按照Hash算法來存儲集合元素,具有很好的存取和查找性能。當(dāng)向HashSet集合中存入一個元素時,HashSet將調(diào)用該對象的hashCode()方法來得到對象的hashCode值,根據(jù)hashCode值決定該對象的存儲位置。在HashSet集合中,若兩個對象的hashCode值相等且通過equals()方法比較返回結(jié)果為true,則HashSet集合認為兩個元素相等。9.1.6Set集合HashSet集合常用構(gòu)造方法見表9-7。表9-7HashSet集合構(gòu)造方法構(gòu)造方法聲明構(gòu)造方法描述HashSet()構(gòu)造一個HashSet集合HashSet(Collectionc)構(gòu)造一個包含指定collection集合對象的列表9.1.6Set集合【例9-7】使用HashSet集合類向集合中添加4句描寫春夏秋冬的詩句,并使用Iterator接口實現(xiàn)集合遍歷。操作步驟:(1)在工程的src目錄下創(chuàng)建包.cvit.set,在包.cvit.set下創(chuàng)建類HashSetDemo。(2)在HashSetDemo.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:9.1.6Set集合package.cvit.set;

importjava.util.HashSet;

importjava.util.Iterator;

/**

*HashSet集合

*/

publicclassHashSetDemo{

publicstaticvoidmain(String[]args){

HashSetpoems=newHashSet();

//實例化HashSet集合對象

poems.add("好雨知時節(jié),當(dāng)春乃發(fā)生。");

//向集合對象添加元素

poems.add("首夏猶清和,芳草亦未歇。");

poems.add("空山新雨后,天氣晚來秋。");

poems.add("冬盡今宵促,年開明日長。");

poems.add("通過詩句可以看出,一年四季分明!!!");

Iteratorit=poems.iterator();

//獲取Iterator迭代器對象

System.out.println("描寫春夏秋冬的詩句:");

while(it.hasNext()){

//遍歷集合并輸出

Stringmovie=(String)it.next();

//將獲取的Object元素強制轉(zhuǎn)換為String類型

System.out.print(movie+"\t");

}

}

}9.1.6Set集合(4)在文本編輯器視圖中,單擊運行按鈕,運行結(jié)果如圖9-8所示。

提示:HashSet類添加元素順序與遍歷輸出元素順序不同。Iterator集合可用于所有集合遍歷。如果向HashSet集合類添加兩個相同的元素,只保留最后一次添加的元素,前面相同的元素將被覆蓋。9.1.6Set集合2. TreeSet類TreeSet是Set集合的實現(xiàn)類之一,TreeSet類還實現(xiàn)了SortedSet集合,SortedSet集合是Set的子集合,實現(xiàn)了對集合的升序排序。TreeSet類實現(xiàn)了Comparable集合,Comparable集合提供了一個intcompareTo(Objectobj)方法用于比較兩個對象的大小,如果兩個對象相同,返回0;如果該對象大于指定對象,返回正整數(shù);如果該對象小于指定對象,返回負整數(shù)。9.1.6Set集合實現(xiàn)Comparable集合類對象的比較方式見表9-8。表9-8實現(xiàn)Comparable集合類對象的比較方式類名比較方式數(shù)值類型包裝類(BigDecimal、Biglnteger、Byte、Double、Float、Integer、Long及Short)按數(shù)值大小比較Character按字符的Unicode值的數(shù)字大小比較String按字符串中字符的Unicode值的數(shù)字大小比較TreeSet類除了實現(xiàn)了Collection集合的方法外,還有一些特有的方法見表9-9。表9-9TreeSet類的常用方法方法聲明方法描述Objectfirst()返回集合中的第一個元素Objectlast()返回集合中的最后一個元素ObjectpoolFirst()移除集合中的第一個元素ObjectpoolLast()移除集合中的最后一個元素9.1.6Set集合【例9-6】通過TreeSet錄入5名學(xué)生Java成績,并將成績升序排序輸出,同時輸出第一名和最后一名成績。操作步驟:(1)在包.cvit.set下創(chuàng)建類TreeSetDemo。(2)在TreeSetDemo.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:9.1.6Set集合package.cvit.set;

importjava.util.Scanner;

importjava.util.TreeSet;

/**

*TreeSet集合

*/

publicclassTreeSetDemo{

publicstaticvoidmain(String[]args){

TreeSetscores=newTreeSet();

//實例化TreeSet對象

Scannersc=newScanner(System.in);

//實例化Scanner對象

for(inti=1;i<=5;i++){

//循環(huán)輸入5名同學(xué)成績

System.out.print("請輸入第"+i+"名同學(xué)的Java成績:");

scores.add(sc.nextInt());

}

System.out.print("由低到高排名后的5名同學(xué)成績:");

System.out.println(scores);

//輸出集合內(nèi)容

//分別輸出集合中最后一個元素和第一個元素

System.out.println("本次Java測試中最高分為:"+scores.last());

System.out.print("本次Java測試中最低分為:"+scores.first());

}

}9.1.6Set集合(4)在文本編輯器視圖中,單擊運行按鈕,運行結(jié)果如圖9-9所示。

提示:

TreeSet集合類默認排序為升序。如果單純輸出集合所有元素,在輸出項中直接給出集合對象名稱即可。9.1.6Set集合9.1知識儲備–Map集合

HashMap類TreeMap類雙列集合Map用于存儲具有映射關(guān)系的數(shù)據(jù)。Map集合中的元素以鍵值對(key-value)形式存儲,即一個鍵對象(key)對應(yīng)一個值對象(value),鍵對象不能相同,值對象可以相同,即同一個Map對象中的任意兩個鍵對象通過equals()方法比較總是返回false。Map集合中的鍵對象和值對象之間存在單向一對一關(guān)系,即通過指定的鍵對象,總能找到唯一的、確定的值對象。9.1.7Map集合Map集合提供了大量的方法,常用的方法見表9-10。表9-10Map集合常用方法方法聲明方法描述voidclear()刪除Map集合中的所有鍵-值對Objectput(Kkey,Vvalue)把指定的鍵和值添加到Map集合中Objectget(Objectkey)返回Map集合中指定鍵對象所對應(yīng)的值Objectremove(Objectkey)刪除指定鍵對應(yīng)的集合元素,返回被刪除元素的值Booleanremove(Objectkey,Objectvalue)刪除指定鍵和值的集合元素booleancontainKey(Objectkey)判斷集合中是否有指定鍵Set<K>keySet()獲取Map集合中所有的鍵,存儲到Set集合中Set<Map.Entry<K,V>>entrySet()獲取Map集合中所有鍵值對對象的Set集合booleanisEmpty()查詢該Map集合是否為空intsize()返回Map集合元素的個數(shù)Collectionvalues()返回Map集合中所有值組成的Collection集合9.1.7Map集合Map集合常用實現(xiàn)類有HashMap集合和TreeMap集合,HashMap集合按照Hash算法來存儲元素,而TreeMap集合按照鍵對象對元素進行排序。1.HashMap集合HashMap集合是Map集合常用實現(xiàn)類,HashMap集合根據(jù)鍵對象的hashCode值存儲元素,根據(jù)鍵對象直接獲取值對象,具有很快的獲取速度。HashMap集合中的鍵對象和值對象是無序的,鍵對象不可重復(fù),值對象可以重復(fù),最多只允許一個集合元素的鍵對象為null,允許多個集合元素的值對象為null。HashMap集合常用構(gòu)造方法如表9-11所示。表9-10Map集合常用方法構(gòu)造方法聲明構(gòu)造方法描述HashMap()構(gòu)造一個HashMap集合HashMap(intinitialCapacity)構(gòu)造一個指定初始容量的HashMap集合9.1.7Map集合【例9-7】使用HashSet存儲3名同學(xué)的學(xué)號和姓名信息,并遍歷輸出學(xué)號和姓名鍵值對。操作步驟:(1)在工程的src目錄下創(chuàng)建包.cvit.map,在包.cvit.map下創(chuàng)建類HashMapDemo。(2)在HashMapDemo.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:9.1.7Map集合package.cvit.map;

importjava.util.HashMap;

importjava.util.Set;

/**

*HashMap集合

*/

publicclassHashMapDemo{

publicstaticvoidmain(String[]args){

HashMapmap=newHashMap();

//實例化HashMap集合對象

map.put("22571301","周全");

//向集合添加3個鍵值對元素

map.put("22571302","趙楠");

map.put("22571303","鄭旭");

Setkeys=map.keySet();

//通過集合的keySet()方法獲取所有的鍵對象

System.out.println("學(xué)生信息Map遍歷結(jié)果如下:");

for(Objectkey:keys){

//遍歷鍵set集合

System.out.println(key+":"+map.get(key));

//通過集合get(key)方法獲取鍵對應(yīng)的值

}

}

}9.1.7Map集合(4)在文本編輯器視圖中,單擊運行按鈕,運行結(jié)果如圖9-10所示。

提示:HashSet遍歷的結(jié)果與添加元素的順序不同。通過Map集合的keySet()方法獲取鍵,再通過Map集合的get(key)方法獲取鍵對應(yīng)的值。9.1.7Map集合【例9-8】利用Map集合的entrySet()方法遍歷集合。操作步驟:(1)在包.cvit.map下創(chuàng)建類EntrySetDemo。(2)在EntrySetDemo.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:9.1.7Map集合package.cvit.map;

importjava.util.HashMap;

importjava.util*;

/**

*entrySet()遍歷Map集合

*/

publicclassEntrySetDemo{

publicstaticvoidmain(String[]args){

HashMapmap=newHashMap();

//實例化HashMap對象

map.put("百度","/");

//向HashMap集合對象添加元素

map.put("淘寶","/");

Setset=map.entrySet();

//通過entrySet()獲取鍵值對的set集合

Iteratorit=set.iterator();

//獲取set集合的迭代器對象

while(it.hasNext()){

//循環(huán)遍歷set集合

Map.Entryentry=(Map.Entry)it.next();

//獲取set集合中的下一個元素,并強轉(zhuǎn)為Map.Entry類型

Objectkey=entry.getKey();

//通過entry對象的getKey()方法獲取HashMap集合的鍵

Objectvalue=entry.getValue();

//通過entry對象的getValue()方法獲取HashMap集合的值

System.out.println(key+":"+value);

}

}

}9.1.7Map集合(4)在文本編輯器視圖中,單擊運行按鈕,運行結(jié)果如圖9-11所示。

提示:Map.Entry是Map的一個內(nèi)部集合,它表示Map中的一個實體(鍵值對),集合中有g(shù)etKey()和getValue()方法,分別獲取Map中的鍵和值。Map中的entrySet()方法返回一個Set對象,此對象的類型為Map.Entry。9.1.7Map集合2. TreeMap類TreeMap類是Map集合的實現(xiàn)類,它的底層與TreeSet相同,因此,可以對集合元素排序且不可重復(fù)。【例9-9】通過TreeMap添加多個元素,整型鍵,字符串型值,并遍歷輸出集合所有元素。操作步驟:(1)在包.cvit.map下創(chuàng)建類TreeMapDemo。(2)在TreeMapDemo.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:9.1.7Map集合package.cvit.map;

importjava.util.*;

/**

*TreeMap集合

*/

publicclassTreeMapDemo{

publicstaticvoidmain(String[]args){

TreeMapmap=newTreeMap();

//實例化TreeMap集合對象

//向集合添加多個順序無規(guī)律的元素,包括重復(fù)鍵的元素

map.put(5,"Tony");

map.put(2,"Alice");

map.put(1,"Tom");

map.put(3,"Adam");

map.put(4,"Joanne");

map.put(1,"Jack");

Setset=map.keySet();

//獲取TreeMap集合對象所有鍵的set集合

Iteratorit=set.iterator();

System.out.println("遍歷TreeMap集合所有元素如下:");

while(it.hasNext()){

Objectkey=it.next();

Objectvalue=map.get(key);

System.out.print(key+":"+value+"");

}

}

}9.1.7Map集合(4)在文本編輯器視圖中,單擊運行按鈕,運行結(jié)果如圖9-12所示。

提示:TreeMap遍歷排序后的數(shù)據(jù)。本例中添加了兩個鍵為1的元素,第2個覆蓋了第一個,說明TreeMap無重復(fù)元素。9.1.7Map集合9.1知識儲備–泛型泛型類泛型接口泛型方法Java中的集合可以存儲任何類型對象,對象存入集合后,其類型信息將丟失,獲取到的元素均為Object類型。這種設(shè)計會帶來兩個問題,一是同一個集合中可能會有多不同類型的元素,例如創(chuàng)建一個保存Student對象的集合中,同樣可以將Teacher類對象“丟”進去,這樣易出現(xiàn)異常;二是在獲取集合元素時,需要通過強制類型轉(zhuǎn)換將元素還原為最初類型,這些強制類型轉(zhuǎn)換增加了程序的復(fù)雜度,同時容易引起類型轉(zhuǎn)換異常。為了解決這些隱患,Java1.5之后Java提供了泛型,泛型可以在編譯的時候檢查類型安全,并且所有的強制轉(zhuǎn)換都是自動和隱式的,提高了代碼的重用率。泛型的本質(zhì)是參數(shù)化類型,也就是給類型指定一個參數(shù),然后在使用時再指定此參數(shù)具體的值,這樣類型就可以在使用時決定了。這種參數(shù)類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。9.1.8泛型1.泛型類泛型類是一種可以接受任意類型參數(shù)的類。泛型類定義的一般格式:publicclass類名<T>T為泛型類型,可以是任意引用類型,亦可以有多個,多個類型之間用逗號分隔。定義好泛型后,需要創(chuàng)建泛型對象,創(chuàng)建泛型對象的一般格式:類名稱<T>對象名稱=new類名稱<T>();例如:ArrayList<Integer>list=newArrayList<Integer>();其中,list對象元素泛型參數(shù)為整型,若存入其它類型元素,編譯將報錯。9.1.8泛型2.泛型接口泛型接口是一種可以接受任意類型參數(shù)的接口。泛型接口定義的一般格式:publicinterface接口名<T>3.泛型方法泛型方法是在調(diào)用方法的時候指明泛型的具體類型,泛型方法定義的一般格式:public<T>返回值類型方法名稱(Tt){

方法體代碼塊}其中,形參數(shù)據(jù)類型為指定的泛型。9.1.8泛型【例9-10】創(chuàng)建一個ArrayList,要求使用泛型限定集合元素類型為Student。操作步驟:(1)在工程的src目錄下創(chuàng)建包.cvit.type,在包.cvit.type下創(chuàng)建類Student類。(2)Student.java文件中撰寫代碼如下:9.1.8泛型package.cvit.type;

/**

*Student學(xué)生類

*/

publicclassStudent{

privateStringid;//學(xué)號

privateStringname;//姓名

privatefloatscore;//成績

//創(chuàng)建有參構(gòu)造方法

publicStudent(Stringid,Stringname,floatscore){

this.id=id;

this.name=name;

this.score=score;

}

publicStringgetId(){

returnid;

}

publicvoidsetId(Stringid){

this.id=id;

}

…………

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicfloatgetScore(){

returnscore;

}

publicvoidsetScore(floatscore){

this.score=score;

}

@Override

publicStringtoString(){//重寫toString()方法

return"Student{"+

"id='"+id+'\''+

",name='"+name+'\''+

",score="+score+

'}';

}

}9.1.8泛型package.cvit.type;

importjava.util.ArrayList;

/**

*泛型在List中的應(yīng)用

*/

publicclassListDemo{

publicstaticvoidmain(String[]args){

ArrayList<Student>list=newArrayList<Student>();

//將ArrayList集合的泛型參數(shù)設(shè)置為Student類

list.add(newStudent("0001","Tony",98.2f));

//分別向list集合中添加3名學(xué)生信息

list.add(newStudent("0002","Alice",76.5f));

list.add(newStudent("0003","Tom",88.6f));

for(Studentstudent:list){

//遍歷集合

System.out.println(student);

}

}

}(3)在包.cvit.type下創(chuàng)建測試類ListDemo。(4)在ListDemo.java文件中撰寫代碼如下:9.1.8泛型(4)在文本編輯器視圖中,單擊運行按鈕,運行結(jié)果如圖9-13所示。

提示:本例中的泛型類型為Student,需要注意在實例化ArrayList集合對象時,Student泛型參數(shù)出現(xiàn)的兩處位置。有了泛型的集合元素類型將被鎖定,不能添加其它類型到集合中。9.1.8泛型【例9-11】通過泛型參數(shù)的Map集合,將例9-10的Student類添加入TreeMap集合中。操作步驟:(1)在包.cvit.type下創(chuàng)建類MapDemo。(2)在MapDemo.java文件中,定義main()方法。(3)文本編輯器視圖中,撰寫代碼如下:9.1.8泛型package.cvit.type;

importjava.util.*;

/**

*泛型在Map中的應(yīng)用

*/

publicclassMapDemo{

publicstaticvoidmain(String[]args){

TreeMap<Integer,Student>map=newTr

溫馨提示

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

最新文檔

評論

0/150

提交評論