集合類-補充案例_第1頁
集合類-補充案例_第2頁
集合類-補充案例_第3頁
集合類-補充案例_第4頁
集合類-補充案例_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

博學谷一一讓IT教學更簡單,讓IT學習更有效第七章集合案例7-1Collection接口對集合的操作一、案例描述1、考核知識點編號:00107002名稱:Collection接口2、練習目標掌握Collection接口中方法的使用3、需求分析Collection是所有單列集合的父接口,在Collection中定義了單列集合(List和Set)通用的一些方法。為了讓初學者熟悉Collection接口中的常用方法,本案例將演示Collection接口中的方法對集合進行操作來學習方法的使用。4、設計思路(實現(xiàn)原理)1)編寫一個類Example012)在類中定義兩個Collection集合,并向其中一個集合中添加數(shù)據(jù)3)用Collection接口中的方法對定義的兩個集合進行各種操作二、案例實現(xiàn)importjava.util.*;publicclassExample01{publicstaticvoidmain(String[]args){//定義集合Collectioncol1=newArrayList();col1.add("123abc");col1.add(123);col1.add(34.121);Collectioncol2=newArrayList();//判斷集合是否為空booleana=col1.isEmpty();booleanb=col2.isEmpty();System.out.println("col1集合是否為空:"+a);System.out.println("col2集合是否為空:"+b);//將集合col1中的元素添加到col2中col2.addAll(col1);System.out.println("col1集合中的元素添加至Ucol2后,col2集合:"+col2);

博學谷一一讓IT教學更簡單,讓IT學習更有效//獲取兩個集合的交集booleanc=col1.retainAll(col2);System.out.println("col1和col2集合是否有交集:"+c);//清除集合col2中的元素col2.clear();System.out.println("清除集合col2中的元素后,col2集合::"+col2);//獲取集合中元素的個數(shù)intsize=col1.size();System.out.println("col1集合中元素的個數(shù):"+size);))運行結果如圖7-1所示。|區(qū)管注員:福今探親存yM,12]LiLl除urite.FMW*.□■iR|區(qū)管注員:福今探親存yM,12]LiLl除urite.FMW*.□■iR2oI「-I.<1-soJEh露井TpE1-AAisn:anpleP-ack-acre>£!lhaiat£rW7>圖7-1運行結果三案例總結、1、Collection是所有單列集合的父接口,因此在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用于操作所有的單列集合,如表7-1所示。表7-1Collection中的方法方法聲明功能描述booleanadd(Objecto)向集合中添加一個元素booleanaddAll(Collectionc)將指定Collection中的所有元素添加到該集合中voidclear()刪除該集合中的所有元素booleanremove(Objecto)刪除該集合中指定的元素booleanremoveAll(Collectionc)刪除指定集合中的所有元素booleanisEmpty()判斷該集合是否為空booleancontains(Objecto)判斷該集合中是否包含某個元素booleancontainsAll(Collectionc)判斷該集合中是否包含指定集合中的所有元素Iteratoriterator()返回在該集合的元素上進行迭代的迭代器(Iterator),用于遍歷該集合所有元素intsize()獲取該集合元素個數(shù)2、在編譯案例時,會得到如圖7-2所示的警告,意思是說在使用ArrayList集合時并沒有顯示的指定集合中存儲什么類型的元素,會產(chǎn)生安全隱患,這涉及到泛型安全機制的問題。此警告對程序輸出結果沒有影響。7aiFi|p'lePackagr'E-'M21haptejawacEx-anipl^iHl?jauia:Exaiwple01..jaua:九用~天/h:土上:一譴『:眉丁.三訓「亡.;";’用Xlintzuncheeked博學谷一一讓IT教學更簡單,讓IT學習更有效圖7-2編譯警告3、在編寫程序時,不要忘記使用importjava.util.*;語句導包,否則程序將會編譯失敗,顯示類找不到。案例7-2 List接口的特有方法一、案例描述1、考核知識點編號:00107003名稱:List接口2、練習目標掌握List接口的常用方法的使用3、需求分析List作為Collection集合的子接口,不但繼承了Collection接口中的全部方法,而且還增加了一些根據(jù)元素索引來操作集合的特有方法。為了熟悉List接口中特有方法的使用,本案例將演示使用List接口中的方法對List集合進行添加、修改等操作。4、設計思路(實現(xiàn)原理)1)編寫一個類Example022)在類中定義兩個list集合,并向其中一個集合中添加數(shù)據(jù)。3)用subList(intfromIndex,inttoIndex)方法獲取集合的一部分4)用set(intindex,Eelement)方法修改一個元素5)用add(intindex,Eelement)方法增加一個元素二、案例實現(xiàn)importjava.util.*;publicclassExample02{publicstaticvoidmain(String[]args){Listlist=newArrayList();list.add("abc1"); //add()方法添加元素list.add("abc2");list.add("abc3");list.add("abc4");System.out.println(list);ListnewList=list.subList(0,2);//subList()方法獲取集合的前兩個元素System.out.println(newList);Objecto=list.set(0,"haha");//set方法修改指定位置元素值為hahaSystem.out.println(list);System.out.println(o);list.add(0,"QQ");//add()方法在集合指定位置增加一個元素QQSystem.out.println(list);)博學谷一一讓IT教學更簡單,讓IT學習更有效運行結果如圖7-3所示。圖7-3運行結果三、案例總結1、在List集合中允許出現(xiàn)重復的元素,所有的元素是以一種線性方式進行存儲的,在程序中可以通過索引來訪問集合中的指定元素。另外,List集合還有一個特點就是元素有序,即元素的存入順序和取出順序一致。2、List作為Collection集合的子接口,不但繼承了Collection接口中的全部方法,而且還增加了一些根據(jù)元素索引來操作集合的特有方法,如表7-2所示。表7-2List接口中的常見方法方法聲明功能描述voidadd(intindex,Objectelement)將元素element插入在List集合的index處booleanaddAll(intindex,Collectionc)將集合c所包含的所有元素插入到List集合的index處Objectget(intindex)返回集合索引index處的元素Objectremove(intindex)刪除index索引處的元素Objectset(intindex,Objectelement)將索引index處元素替換成element對象,并將替換后的元素返回intindexOf(Objecto)返回對象o在List集合中出現(xiàn)的位置索引intlastIndexOf(Objecto)返回對象o在List集合中最后一次出現(xiàn)的位置索引ListsubList(intfromIndex,inttoIndex)返回從索引fromIndex(包括)到toIndex(不包括)處所有元素集合組成的子集合案例7-3ArrayList集合的存取一、案例描述1、考核知識點編號:00107004名稱:ArrayList集合2、練習目標>了解ArrayList集合的特點> 掌握對ArrayList集合中元素的存取操作3、需求分析ArrayList是List接口的一個實現(xiàn)類,ArrayList集合中大部分方法都是從父類Collection和博學谷一一讓IT教學更簡單,讓IT學習更有效List繼承過來的。為了熟悉ArrayList集合的使用,本案例將演示ArrayList集合的定義、存儲元素和取出元素。4、設計思路(實現(xiàn)原理)1)編寫一個類Example032)在類中定義一個ArrayList集合3)用add()方法向集合中添加元素4)用get()方法獲取集合中的指定元素,由于ArrayList集合的索引的取值范圍是從0開始的,最后一個索引是size-1。所以,要獲取集合中的第2個元素應該是get(1)。二、案例實現(xiàn)importjava.util.*;publicclassExample03{publicstaticvoidmain(String[]args){ArrayListarray=newArrayList();array.add("lisi");array.add("wangwu");array.add("jordan");array.add("jackson");array.add("white");System.out.println(array);System.out.println("M2個元素是:"+array.get(1));))運行結果如圖7-4所示。圖7-4運行結果三、案例總結1、在ArrayList內部封裝了一個長度可變的數(shù)組對象,當存入的元素超過數(shù)組長度時,ArrayList會在內存中分配一個更大的數(shù)組來存儲這些元素,因此可以將ArrayList集合看作一個長度可變的數(shù)組。2、索引位置為1的元素是集合中的第二個元素,這就說明集合和數(shù)組一樣,索引的取值范圍是從0開始的,最后一個索引是size-1,在訪問元素時一定要注意索引不可超出此范圍,否則會拋出角標越界異常IndexOutOfBoundsException。3、由于ArrayList集合的底層是使用一個數(shù)組來保存元素,在增加或刪除指定位置的元素時,會導致創(chuàng)建新的數(shù)組,效率比較低,因此不適合做大量的增刪操作。但這種數(shù)組的結構允許程序通過索引的方式來訪問元素,因此使用ArrayList集合查找元素很便捷。博學谷一一讓IT教學更簡單,讓IT學習更有效案例7-4LinkedList集合的特殊方法一、案例描述1、考核知識點編號:00107005名稱:LinkedList集合2、練習目標>了解LinkedList集合的特點掌握LinkedList集合的特殊方法的使用3、需求分析ArrayList集合在查詢元素時速度很快,但在增刪元素時效率較低,為了克服這種局限性,可以使用List接口的另一個實現(xiàn)類LinkedListoLinkedList集合除了對于元素的增刪操作具有很高的效率,還專門針對元素的增刪操作定義了一些特有的方法。為了熟悉這些特殊的方法,本案例將演示如何使用LinkedList中的特殊方法對集合進行增刪操作。4、設計思路(實現(xiàn)原理)1)編寫一個類Example04,在該類中定義一個LinkedList集合2)分別使用addFirst()和addLast()方法向集合中添加元素3)使用peekFirst()方法獲取集合中的第一個元素4)使用pollFirst()方法獲取并移除集合中的第一個元素5)使用pollLast()方法獲取并移除集合中的最后一個元素6)此時,集合中應該沒有元素了,用peekLast()方法獲取集合中的最后一個元素,由于集合為空,應該返回NULL二、案例實現(xiàn)importjava.util.*;publicclassExample04{publicstaticvoidmain(String[]args){LinkedListlink=newLinkedList();link.addFirst("abc1"); //將指定元素插入此集合的開頭link.addLast("haha"); //將指定元素添加到此集合的結尾System.out.println(link.peekFirst());//獲取但不移除此集合的第一個元素System.out.println(link.pollFirst());//獲取但不移除此集合的最后一個元素System.out.println(link);System.out.println(link.pollLast());//獲取并移除此集合的第一個元素System.out.println(link);System.out.println(link.peekLast());//獲取并移除此集合的最后一個元素))運行結果如圖7-5所示。博學谷一一讓IT教學更簡單,讓IT學習更有效圖7-5運行結果三、案例總結1、LinkedList集合內部維護了一個雙向循環(huán)鏈表,鏈表中的每一個元素都使用引用的方式來記住它的前一個元素和后一個元素,從而可以將所有的元素彼此連接起來。當插入一個新元素時,只需要修改元素之間的這種引用關系即可,刪除一個節(jié)點也是如此。正因為這樣的存儲結構,所以LinkedList集合對于元素的增刪操作具有很高的效率。2、在本案例中,所用的方法及其功能具體如下:1)peekFirst()方法用于獲取LinkedList集合中的第一個元素,如果此列表為空則返回NULL2)peekLast()方法用于獲取LinkedList集合中的最后一個元素,如果此列表為空則返回NULL3)pollFirst()方法用于獲取并移除LinkedList集合中的第一個元素,如果此列表為空則返回NULL4)pollLast()方法用于獲取并移除LinkedList集合中的最后一個元素,如果此列表為空則返回NULLaddFirst()方法用于添加LinkedList集合中的第一個元素addLast()方法用于添加LinkedList集合中的最后一個元素案例7-5Iterator遍歷集合元素一、案例描述1、考核知識點編號:00107006名稱:Iterator接口2、練習目標掌握Iterator迭代器的使用3、需求分析在程序開發(fā)中,經(jīng)常需要遍歷集合中的所有元素。針對這種需求,JDK專門提供了一個接口Iterator。為了使初學者熟悉Iterator迭代器的使用,本案例將演示如何使用Iterator迭代器遍歷集合中的元素。4、設計思路(實現(xiàn)原理)1)編寫一個類Example05)在類中定義一個List集合,并向集合中添加數(shù)據(jù))通過調用List集合的iterator。方法獲得迭代器對象)在while循環(huán)條件中使用hashNext()方法判斷集合中是否存在下一個元素,如果存在,則調用next()方法將元素取出,否則說明已到達了集合末尾,停止遍歷元素

博學谷一一讓IT教學更簡單,讓IT學習更有效二、案例實現(xiàn)定義Example05類,其代碼如下:importjava.util.*;publicclassExample05{publicstaticvoidmain(String[]args){Listlist=newArrayList();list.add("abc1"); //向集合中添加元素list.add("abc2");list.add("abc3");list.add("abc4");Iteratorit=list.iterator();//獲取迭代器對象while(it.hasNext()){ /判斷是否還有元素Objectobj=it.next();/取出元素System.out.println(obj);)))運行結果如圖7-6所示。圖7-6圖7-6運行結果三、案例總結1、需要注意的是,在通過next()方法獲取元素時,必須保證要獲取的元素存在,否則,會拋出NoSuchElementException異常。.Iterator迭代器對象在遍歷集合時,內部采用指針的方式來跟蹤集合中的元素,圖7-7演示了Iterator對象迭代元素的過程。第一次迫卬not。方法的正0值第一個元素第二個元素最后一個元素is用T+第一個元素第二個元素最后一個元素is用T+方法才首eT1O

第一次調用E方法第二次調用父方法II方法返回式迭代器終止圖7-7遍歷元素過程圖博學谷一一讓IT教學更簡單,讓IT學習更有效案例7-6foreach循環(huán):簡化遍歷一、案例描述1、考核知識點編號:00107007名稱:foreach循環(huán)2、練習目標掌握使用foreach循環(huán)遍歷集合和數(shù)組3、需求分析雖然Iterator可以用來遍歷集合中的元素,但寫法上比較繁瑣,為了簡化書寫,從JDK5.0開始,提供了foreach循環(huán)。foreach循環(huán)用于遍歷數(shù)組或集合中的元素。為了讓初學者能熟悉foreach循環(huán)的使用,本案例將演示如何用foreach循環(huán)遍歷數(shù)組和集合中的元素。4、設計思路(實現(xiàn)原理)1)編寫一個類Example06,2)在該類中定義一個List集合,向集合中添加四個元素3)用foreach循環(huán)遍歷集合中的元素4)在類中定義一個數(shù)組arr,靜態(tài)初始化數(shù)組int[]arr={3,2,6};5)用foreach循環(huán)遍歷arr中的元素二、案例實現(xiàn)importjava.util.*;publicclassExample06{publicstaticvoidmain(String[]args){//創(chuàng)建list集合Listlist=newArrayList();list.add("sv");list.add("lv");list.add("mv");list.add("tv");System.out.println("遍歷集合中的元素:");for(Objectobj:list){ //foreach循環(huán)遍歷集合中的元素System.out.println(obj);)//定義數(shù)組int[]arr={3,2,6};System.out.println("遍歷數(shù)組中的元素:");for(intx:arr){ //foreach循環(huán)遍歷數(shù)組中的元素System.out.println(x);}}博學谷一一讓IT教學更簡單,讓IT學習更有效運行結果如圖7-8所示。圖7-8運行結果三、案例總結1、通過案例可以看出,foreach循環(huán)在遍歷集合時語法非常簡潔,沒有循環(huán)條件,也沒有迭代語句,所有這些工作都交給虛擬機去執(zhí)行了。foreach循環(huán)的次數(shù)是由容器中元素的個數(shù)決定的,每次循環(huán)時,foreach中都通過變量將當前循環(huán)的元素記住,從而將集合中的元素分別打印出來。2、使用foreach循環(huán)遍歷集合和數(shù)組時,只能訪問集合中的元素,不能對其中的元素進行修改。案例7-7Listiterator迭代器的特有方法一、案例描述1、考核知識點編號:00107008名稱:Listiterator接口2、練習目標掌握Listiterator接口中特有方法的使用3、需求分析Listiterator迭代器是Iterator的子類,該類在父類的基礎上增加了一些特有方法。為了讓初學者能熟悉Listiterator接口中特有方法的使用,本案例將演示如何用Listiterator接口中的方法向集合中插入元素和逆向遍歷集合。4、設計思路(實現(xiàn)原理)1)編寫一個類Example072)在該類中定義一個List集合,向集合中添加四個元素3)用Listiterator接口的add()方法向集合中插入一個元素并遍歷集合list4)用Listiterator接口的booleanhasPrevious()方法逆向遍歷集合二、案例實現(xiàn)importjava.util.*;publicclassExample07{publicstaticvoidmain(String[]args){10博學谷一一讓IT教學更簡單,讓IT學習更有效Listlist=newArrayList();list.add("abc1");list.add("abc2");list.add("abc3");list.add("abc4");Listiteratorlit=list.listIterator();while(lit.hasNext()){Objecto=lit.next();//遍歷到abc4元素時,向集合中添加一個元素if("abc4".equals(o)){lit.add("abc5");)System.out.println(o);)//逆向遍歷集合System.out.println("以下是逆向遍歷");while(lit.hasPrevious()){System.out.println(lit.previous());)))運行結果如圖7-9所示。圖7-9運行結果三、案例總結1、Listiterator迭代器的特有方法,如表7-3所示。表7-3Listiterator迭代器的特有方法方法聲明功能描述voidadd(Objecto)將指定的元素插入列表(可選操作)booleanhasPrevious()如果以逆向遍歷列表,列表迭代器有多個元素,則返回trueObjectprevious()返回列表中的前一個元素voidremove()從列表中移除由next或previous返回的最后一個元素(可選操作)2、在本案例中,使用hasPrevious()方法判斷是否存在上一個元素,如果存在,則通過previous。方法將元素取出,否則,則表示到達了集合的末尾,沒有要遍歷的元素。3、在遍歷過程中,如果想增加元素同樣不能調用集合對象的add()方法,此時需要使用Listiterator提11博學谷一一讓IT教學更簡單,讓IT學習更有效供的add()方法,否則會出現(xiàn)并發(fā)修改異常ConcurrentModificationException。需要注意的是,Listiterator迭代器只能用于List集合。案例7-8用Enumeration迭代Vector集合一、案例描述1、考核知識點編號:00107009名稱:Enumeration接口2、練習目標掌握如何使用Enumeration迭代器的特有方法遍歷Vector集合中的元素3、需求分析在JDK1.2以前還沒有Iterator接口的時候,遍歷集合需要使用Enumeration迭代器接口。由于很多程序中依然在使用Enumeration,因此了解該接口的用法是很有必要的。Vevtor集合是List接口的一個實現(xiàn)類。為了讓初學者能熟悉 Enumeration迭代器的用法,本案例將演示如何用Enumeration迭代器遍歷Vector集合。4、設計思路(實現(xiàn)原理)1)編寫一個類Example08,在該類中定義一個Vector集合v2)向集合v中添加四個元素3)用Enumeration迭代器遍歷集合v,輸出集合中的每一個元素二、案例實現(xiàn)importjava.util.*;publicclassExample08{publicstaticvoidmain(String[]args){Vectorv=newVector(); /創(chuàng)建Vector集合v.addElement("秦始皇");v.addElement("成吉思汗");v.addElement("朱元璋");v.addElement("李世民");Enumeratione=v.elements();while(e.hasMoreElements()){//Enumeration迭代器遍歷Vector集合Stringname=(String)e.nextElement();System.out.println(name);)))運行結果如圖7-10所示。12博學谷一一讓IT教學更簡單,讓IT學習更有效圖7-10運行結果三、案例總結1、JDK中提供了一個Vevtor集合,該集合是List接口的一個實現(xiàn)類,用法與ArrayList完全相同,區(qū)別在于Vector集合是線程安全的,而ArrayList集合是線程不安全的。在Vector類中提供了一個elements()方法用于返回Enumeration對象,通過Enumeration對象就可以遍歷該集合中的元素。2、在本案例中,使用Enumeration迭代器時,使用一個while循環(huán)對集合中的元素進行迭代,其過程與Iterator迭代的過程類似,通過hasMoreElements()方法循環(huán)判斷是否存在下一個元素,如果存在,則通過nextElement()方法逐一取出每個元素。案例7-9HashSet集合的存儲一、案例描述1、考核知識點編號:00107010名稱:HashSet集合2、練習目標>了解HashSet集合的存儲特點>掌握HashSet集合的用法3、需求分析HashSet是Set接口的一個實現(xiàn)類,它所存儲的元素是不可重復的,并且元素都是無序的。為了讓初學者熟悉HashSet集合的用法,本案例將針對HashSet集合中元素不可重復的特點,對HashSet集合的存儲和遍歷過程進行演示。4、設計思路(實現(xiàn)原理)1)編寫一個類Example09,在該類中定義一個HashSet集合hs2)向集合hs中添加6個元素,其中有一些重復的元素3)用size()方法獲取添加完元素后集合中元素的個數(shù)4)用Iterator迭代器遍歷集合的每一個元素5)觀察在輸出結果中,是否存在重復的元素二、案例實現(xiàn)importjava.util.*;publicclassExample09{publicstaticvoidmain(String[]args){13

博學谷一一讓IT教學更簡單,讓IT學習更有效//創(chuàng)建HashSet集合HashSeths=newHashSet();//向HashSet集合中添加元素,其中包括重復元素hs.add("abc2");hs.add("abc2");hs.add("abc1");hs.add("abc4");hs.add("abc4");hs.add("abc3");//輸出集合中元素的個數(shù)System.out.println("添加后集合中元素個數(shù):"+hs.size());//輸出集合中每一個元素Iteratorit=hs.iterator();System.out.println("添加后集合中包含以下元素:”);while(it.hasNext()){System.out.println(it.next());)))運行結果如圖7-11所示。篆堂里壽妻個數(shù)1吐.=!”佯kL,篆堂里壽妻個數(shù)1吐.=!”佯kL,■如Exwipl壯19圖7-11運行結果三、案例總結1、HashSet是Set接口的一個實現(xiàn)類,它所存儲的元素是不可重復的,并且元素都是無序的。當向HashSet集合中添加一個對象時,首先會調用該對象的hashCode()方法來確定元素的存儲位置,然后再調用對象的equals()方法來確保該位置沒有重復元素。2、在本案例中,首先通過add()方法向HashSet集合依次添加了六個字符串,然后通過Iterator迭代器遍歷所有的元素并輸出打印。從打印結果可以看出取出元素的順序與添加元素的順序并不一致,并且重復存入的字符串對象"abc2"和"abc4"被去除了,只添加了一次。案例7-10將Object類存入HashSet一、案例描述1、考核知識點14博學谷一一讓IT教學更簡單,讓IT學習更有效編號:00107010名稱:HashSet集合2、練習目標掌握如何將對象存入HashSet集合并且去除重復對象3、需求分析HashSet集合之所以能確保不出現(xiàn)重復的元素,是因為它在添加對象時,會先調用該對象的hashCode()方法來確定元素的存儲位置,再調用對象的equals()方法來確保該位置沒有重復元素。為了將Object類存入HashSet集合,本案例將針對如何重寫Object類中的hashCode()和equals()方法去除重復的Object對象進行演示。4、設計思路(實現(xiàn)原理)1)設計一個Person類,在該類中定義兩個變量name和age2)在Person類中重寫hashCode()和equals()方法3)編寫類Example10,在該類中定義一個HashSet集合4)將Person對象存入HashSet集合中,其中含有重復的Person對象5)遍歷HashSet集合中的元素,觀察結果是否含有重復的對象二、案例實現(xiàn)設計Person類,其代碼如下:classPerson{privateStringname;privateintage;publicPerson(Stringname,intage){=name;this.age=age;)//重寫hashCode方法,返回name屬性的哈希值publicinthashCode(){returnname.hashCode()+age*2;)//重寫equals方法publicbooleanequals(Objectobj){if(this==obj)returntrue;if(objinstanceofPerson){Personp=(Person)obj;return.equals()&&this.age==p.age;)returnfalse;)//重寫toString()方法publicStringtoString(){return"Person"+name+age;)15博學谷一一讓IT教學更簡單,讓IT學習更有效publicclassExample10{publicstaticvoidmain(String[]args){//創(chuàng)建HashSet對象HashSeths=newHashSet();//將Person對象存入集合hs.add(newPerson("lisa”,21));hs.add(newPerson("lisi”,32));hs.add(newPerson("lisi”,32));hs.add(newPerson("leilei”,31));hs.add(newPerson("lusi”,25));hs.add(newPerson("lusi”,25));//遍歷集合中的元素Iteratorit=hs.iterator();while(it.hasNext()){Personp=(Person)it.next();System.out.println(p);)))運行結果如圖7-12所示。圖7-12運行結果三、案例總結在本案例中,當HashSet集合的存入元素時,首先調用當前存入對象的hashCode()方法獲得name屬性的哈希值,然后根據(jù)對象的哈希值計算出一個存儲位置。如果該位置上沒有元素,則直接將元素存入,如果該位置上有元素存在,則會調用equals()方法讓當前存入的元素依次和該位置上的元素進行比較,如果返回的結果為false就將該元素存入集合,返回的結果為true則說明有重復元素,就將該元素舍棄。整個存儲的流程如圖7-13所示。16博學谷一一讓IT教學更簡單,讓IT學習更有效圖7-13HashSet對象存儲過程案例7-11TreeSet集合的存儲一、案例描述1、考核知識點編號:00107012名稱:TreeSet集合2、練習目標>了解TreeSet集合的存儲特點>掌握TreeSet集合的存儲和迭代操作3、需求分析TreeSet是Set接口的另一個實現(xiàn)類,它內部采用平衡二叉樹來存儲元素,這樣的結構可以保證TreeSet集合中沒有重復的元素,并且可以對元素進行排序。為了讓初學者能熟悉TreeSet集合的使用,本案例通過向TreeSet集合添加元素并遍歷集合元素來演示。4、設計思路(實現(xiàn)原理)1)編寫一個類Examplell,定義一個TreeSet集合2)向TreeSet集合中添加一系列元素,其中有重復元素3)遍歷輸出TreeSet集合中所有的元素二、案例實現(xiàn)importjava.util.*;publicclassExamplell{publicstaticvoidmain(String[]args){17博學谷一一讓IT教學更簡單,讓IT學習更有效TreeSetts=newTreeSet();//創(chuàng)建TreeSet集合ts.add("abc3"); //向集合中添加一系列元素,其中包括重復元素ts.add("abc2");ts.add("abc4");ts.add("aabbcc");ts.add("aabbcc");ts.add("abc1");Iteratorit=ts.iterator();while(it.hasNext()){ //使用Iterator迭代器遍歷TreeSet集合元素System.out.println(it.next());)))運行結果如圖7-14所示。三宜電員:金等鬟系存:r457>j.BiuaE'xajinpli!:11舞hJbc心hcl加2Pm:3辰4圖7-14運行結果三、案例總結TreeSet內部采用平衡二叉樹來存儲元素,所謂二叉樹就是說每個節(jié)點最多有兩個子節(jié)點的有序樹,每個節(jié)點及其子節(jié)點組成的樹稱為子樹,通常左側的子節(jié)點稱為“左子樹”右側的節(jié)點稱為“右子樹”,其中左子樹上的元素應小于它的根結點,而右子樹上的元素應大于它的根結點。二叉樹中元素的存儲結構如圖7-15所示。圖7-15二叉樹的存儲結構案例7-12自定義比較器一、案例描述1、考核知識點編號:0010701318博學谷一一讓IT教學更簡單,讓IT學習更有效名稱:Comparator比較器2、練習目標掌握如何通過自定義比較器的方式對TreeSet集合中的元素排序3、需求分析如果定義的類沒有實現(xiàn)Comparable接口或者對于實現(xiàn)了Comparable接口的類而不想按照定義的compareTo(歷法進行排序,這時,可以通過自定義比較器的方式對TreeSet集合中的元素排序。為了讓初學者能掌握自定義比較器的編寫,本案例將通過自定義比較器對TreeSet集合中的元素排序。4、設計思路(實現(xiàn)原理)1)設計類Person,該類中有變量name和age,并實現(xiàn)它們的get()和set()方法。2)設計類MyComparator自定義比較器,該類實現(xiàn)了Comparator接口3)在類MyComparator中實現(xiàn)比較方法,以Person對象中age為主要比較條件,如果age相等再比較name4)編寫類Example12,創(chuàng)建TreeSet集合,在創(chuàng)建TreeSet集合時傳入自定義比較器MyComparator。并將Person對象存入集合中5)遍歷集合中的元素,觀察執(zhí)行結果二、案例實現(xiàn)改寫Person類,具體代碼如下:classPerson{privateStringname;privateintage;publicPerson(Stringname,intage){=name;this.age=age;publicStringtoString(){}return“Perso…ame…publicStringgetName(){,publicvoidsetName(Stringname){「一=name;publicintgetAge(){}return毋publicvoidsetAge(intage){this.age=age;自定義比較器,具體代碼如下:19博學谷一一讓IT教學更簡單,讓IT學習更有效classMyComparatorimplementsComparator{publicintcompare(Objecto1,Objecto2){//類型轉換,比較的是Person對象Personp1=(Person)o1;Personp2=(Person)o2;//以年齡為主要條件intnum=p1.getAge()-p2.getAge();returnnum==0?p1.getName().compareTo(p2.getName()):num;))編寫Example12類,具體代碼如下:importjava.util.TreeSet;importjava.util.Iterator;importjava.util.Comparator;publicclassExample12{publicstaticvoidmain(String[]args){TreeSetts=newTreeSet(newMyComparator());ts.add(newPerson("lisa”,22));ts.add(newPerson("lisi”,24));ts.add(newPerson("lisi”,21));ts.add(newPerson("wangwu”,20));ts.add(newPerson("zhaoliu”,19));ts.add(newPerson("zhaoliu”,26));Iteratorit=ts.iterator();while(it.hasNext()){System.out.println(it.next());)))運行結果如圖7-16所示。圖7-16運行結果三、案例總結在本案例中,定義了一個MyComparator類實現(xiàn)了Comparator接口,在compare。方法中實現(xiàn)元素的比較,這就相當于定義了一個比較器。在創(chuàng)建TreeSet集合時,將MyComparator比較器對象傳入,當向集合中添加元素時,比較器對象的compare。方法就會被自動調用,從而使存入TreeSet集合中的字符串按照長度進行排序。20博學谷一一讓IT教學更簡單,讓IT學習更有效案例7-13操作HashMap集合的方法一、案例描述1、考核知識點編號:00107014名稱:HashMap集合2、練習目標了解HashMap集合的存儲特點掌握如何使用操作HashMap集合的方法3、需求分析Map接口用于存儲具有對應關系的數(shù)據(jù)。它的每個元素都包含一個鍵對象Key和值對象Value,鍵和值對象之間存在映射。HashMap集合是Map接口的一個實現(xiàn)類。為了讓初學者能熟悉使用HashMap集合,本章將采用使用不同方法對HashMap集合進行操作,學習HashMap集合的使用方法。4、設計思路(實現(xiàn)原理)1)編寫類Example13,創(chuàng)建一個HashMap集合,并向集合中添加元素2)使用一系列方法分別對定義的集合進行增加、移除、判斷等操作3)運行程序,根據(jù)輸出結果,分析這些方法對HashMap集合的操作二、案例實現(xiàn)編寫Example13類,具體代碼如下:importjava.util.*;publicclassExample13{publicstaticvoidmain(String[]args){//創(chuàng)建集合對象Mapmap=newHashMap();//添加元素map.put("czbk001","林青霞");map.put("czbk003","林志玲");map.put("czbk002","林志穎");//添加元素,如果鍵存在,就替換,返回以前與key關聯(lián)的值。System.out.println(map.put("czbk003","林志炫"));//Vremove(Objectkey):根據(jù)指定的鍵刪除鍵值對。System.out.println("remove:"+map.remove("czbk003"));//判斷指定的鍵是否在集合中存在System.out.println("containsKey:"+map.containsKey("czbk002"));System.out.println("containsKey:"+map.containsKey("czbk007"));//判斷指定的值是否在集合中存在System.out.println("containsValue:"+map.containsValue("林志穎"));//判斷集合是否為空21博學谷一一讓IT教學更簡單,讓IT學習更有效System.out.println("isEmpty:"+map.isEmpty());//集合中元素的個數(shù)System.out.println("size:"+map.size());//輸出集合對象名稱System.out.println("map:"+map);))運行結果如圖7-17所示。工管理!立命令存小存葉千:一=林志施心nim*同Wit口N?y:truecz第mtwHn也加?y=f?i1edci>ritalni£UjLlLii.e二電bIecxSn.^p:<nnhkPlRI士富,clHl(RflS-土尸七呈=>D:MajmplEPaiiGkagEMilhiaFtEfQ1?).圖7-17運行結果三、案例總結在本案例中,從運行結果可以看出:1)集合中鍵為czbk003對應的值是“林志玲”。2)由于集合中存在鍵czbk003,所以程序做map.put(”czbk003","林志炫”)操作時,值會替換為'林志炫"。所以刪除鍵為czbk003的對象時,程序輸出remove:"林志炫”。由此證實了Map中的鍵必須是唯一的,不能重復。如果存儲了相同的鍵,后存儲的值則會覆蓋原有的值,簡而言之就是,鍵相同,值覆蓋。3)"czbk002”在集合中存在,所以輸出true。"czbk007”在集合中不存在,輸出false.4)值”林志穎”在集合中存在,所以輸出true。5)因為集合不為空,所以map.isEmpty()返回false。案例7-14遍歷Map中所有的鍵值一、案例描述1、考核知識點編號:00107014名稱:HashMap集合2、練習目標掌握遍歷Map中所有的鍵值兩種方法3、需求分析在程序開發(fā)中,經(jīng)常需要取出Map中所有的鍵和值。為了讓大家熟悉遍歷Map中所有的鍵值,本案例將演示遍歷Map中所有的鍵值對的兩種遍歷方式。4、設計思路(實現(xiàn)原理)1)編寫類Example14,在該類中創(chuàng)建Map集合并向集合中添加元素22博學谷一一讓IT教學更簡單,讓IT學習更有效2)使用第一種方式,遍歷集合元素,先獲取鍵的集合,再獲取鍵所對應的值3)使用第二種方式,先獲取集合中鍵值對映射關系,再從映射關系中獲得鍵和值二、案例實現(xiàn)importjava.util.*;publicclassExample14{publicstaticvoidmain(String[]args){//創(chuàng)建集合對象Mapmap=newHashMap();//添加元素map.put("001","李世民");map.put("002","朱元璋");map.put("003","武則天");System.out.println("方式一遍歷:”);//遍歷1:先獲取鍵的集合,再獲取鍵所對應的值Setkeyset=map.keySet();for(Objectkey:keyset){Objectvalue=map.get(key);System.out.println(key+"***"+value);)System.out.println("方式二遍歷:");//遍歷2:先獲取集合中鍵值對映射關系,再從關系中獲得鍵和值Set<Map.Entry>mapSet=map.entrySet();for(Map.Entryme:mapSet){Objectkey=me.getKey();Objectvalue=me.getValue();System.out.println(key+"***"+value);)))運行結果如圖7-18所示。圖7-18運行結果23博學谷一一讓IT教學更簡單,讓IT學習更有效三、案例總結1、在本案例中,第一種遍歷Map的方式是首先調用Map對象的KeySet()方法,獲得存儲Map中所有鍵的Set集合,然后通過foreach循環(huán)遍歷集合中的所有的鍵,最后通過調用get(key)方法,根據(jù)鍵獲取對應的值。2、本案例中的第二種遍歷Map的方式,首先調用Map對象的entrySet()方法獲得存儲Map中所有映射的Set集合,這個集合中存放了Map.Entry類型的元素(Entry是Map接口內部類),每個Map.Entry對象代表Map中的一個鍵值對,然后迭代Set集合,獲得每一個映射對象,并分別調用映射對象的getKey()和getValue()方法獲取鍵和值。3、在Map中,還提供了一個values()方法,通過這個方法可以直接獲取Map中存儲所有值的Collection集合。獲取代碼如下:Collectionvalues=map.values();for(Objectvalue:values){System.out.println(value);)將此代碼替換案例中的兩種遍歷方法的代碼,運行結果如圖7-19所示。圖7-19運行結果案例7-15TreeMap集合的存取一、案例描述1、考核知識點編號:00107015名稱:TreeMap集合2、練習目標了解TreeMap集合的存儲特點掌握TreeMap集合存儲和迭代方法3、需求分析TreeMap集合用來存儲鍵值映射關系,其中不允許出現(xiàn)重復的鍵。在TreeMap中是通過二叉樹的原理來保證鍵的唯一性,因此 TreeMap中所有的鍵是按照某種順序排列的。為了熟悉TreeMap集合的使用,本案例將使用TreeMap集合獲取一個字符串中每一個字母出現(xiàn)的次數(shù),在實現(xiàn)這一功能的過程中掌握TreeMap集合存儲和迭代方法。4、設計思路(實現(xiàn)原理)1)編寫一個類Example15,要獲取字符串"cbxzbvavdvgd"中,每一個字母出現(xiàn)次數(shù),先將字符串轉化成數(shù)組2)定義一個TreeMap集合,字符出現(xiàn)的次數(shù)作為鍵,每一個字符作為值24

博學谷讓博學谷讓IT教學更簡單,讓IT學習更有效3)遍歷字符數(shù)組,獲取到每一個字符4)拿到每一個字符,到TreeMap集合中找對應的值,判斷返回值是否為NULL5)如果返回值是NULL,就將字符存儲到TreeMap集合中,對應的鍵記為16)如果返回值不為NULL,就將鍵值加1,并重新將值(字符)和鍵(出現(xiàn)的次數(shù))存入集合7)把TreeMap的元素拼接成一個字符串,輸出結果二、案例實現(xiàn)importjava.util.*;publicclassExample15{publicstaticvoidmain(String[]args){Strings="cbxzbvavdvgd";/把字符串變成字符數(shù)組。char[]chs=s.toCharArray();//定義一個TreeMap集合TreeMap<Character,Integer>tm=newTreeMap<Character,Integer>();//遍歷字符數(shù)組,獲取到每一個字符。for(charch:chs){/拿到該字符,到TreeMap集合中找對應的值Integeri=tm.get(ch);//根據(jù)返回值是否為null。是:存儲,把次數(shù)記錄為1;否:把數(shù)據(jù)++,然后重寫存儲if(i==null){tm.put(ch,1);}else{i++;tm.put(ch,i);}}//把TreeMap的數(shù)據(jù)拼接成一個字符串。StringBuildersb=newStringBuilder();Set<Character>set=tm.keySet();for(Characterch:set){Integeri=tm.get(ch);sb.append(ch).append("(").append(i).append(")");}Stringresult=sb.toString();System.out.println(result);}}運行結果如圖7-20所示。圖7-20運行結果圖7-20運行結果25博學谷一一讓IT教學更簡單,讓IT學習更有效三、案例總結1、在本案例中,演示了TreeMap集合中元素的存儲和迭代方法與HashMap相同。從輸出結果可以看出,TreeMap集合中的元素是不重復的,并且按照值的自然順序進行了排序。這是因為在TreeMap中是通過二叉樹的原理來保證鍵的唯一性,這個TreeSet集合存儲的原理一樣,因此TreeMap中所有的鍵是按照某種順序排列的。2、本案例中,在定義TreeMap集合時使用了泛型,即〈參數(shù)化類型>。它可以指定該類中方法操作的數(shù)據(jù)類型,避免在集合存取時會產(chǎn)生的數(shù)據(jù)類型轉化的錯誤。案例7-16 Proeprties集合的功能一、案例描述1、考核知識點編號:00107016名稱:Proeprties集合2、練習目標掌握Proeprties集合的存儲和遍歷方法3、需求分析Map接口中還有一個實現(xiàn)類Hashtable,它和HashMap的區(qū)別是Hashtable是線程安全的。Hashtable類有一個子類Properties在實際應用中非常重要,Properties主要用來存儲字符串類型的鍵和值,為了掌握Properties集合的使用,本案例將演示Properties集合中元素的存儲,修改和遍歷。4、設計思路(實現(xiàn)原理)1)編寫一個類Example16,創(chuàng)建Proeprties集合對象2)向Proeprties集合中添加元素3)遍歷Proeprties集合中的元素二、案例實現(xiàn)importjava.util.*;publicclassExample16{publicstaticvoidmain(String[]args){//創(chuàng)建集合對象Propertiesprop=newProperties();添加元素prop.setProperty("劉備","雙股劍");prop.setProperty(關羽","青龍偃月刀");prop.setProperty(張飛","丈八蛇矛");Set<String>set=prop.stringPropertyNames();for(Stringkey:set){26博學谷一一讓IT教學更簡單,讓IT學習更有效Stringvalue=prop.getProperty(key);System.out.println(key+" "+value);)))運行結果如圖7-21所示。圖7-21運行結果三、案例總結Properties類中,針對字符串的存取提供了兩個專用的方法setProperty()和getProperty()。setProperty()方法用于將配置項的鍵和值添加到Properties集合當中。propertyNames()方法得到一個包含所有鍵的set對象,然后在遍歷所有的鍵時,通過調用getProperty()方法獲得鍵所對應的值。案例7-17泛型的使用一、案例描述1、考核知識點編號:00107017名稱:泛型的使用2、練習目標>了解為什么要使用泛型>掌握泛型的使用方法3、需求分析集合可以存儲任何類型的對象,但是在程序中無法確定一個集合中的元素到底是什么類型的。那么在取出元素時,如果進行強制類型轉換就很容易出錯。為了解決這個問題,在Java中引入了“參數(shù)化類型(parameterizedtype)”這個概念,即泛型。本案例將使用泛型來限定集合元素的數(shù)據(jù)類型,從而方便初學者學習泛型的使用方法。4、設計思路(實現(xiàn)原理)1)編寫一個類Example17,創(chuàng)建ArrayList集合對象,并指定集合只能存儲String類型的元素2)向集合中添加元素,其中有一個Integer類型的元素3)遍歷集合中的元素,觀察結果是否報錯二、案例實現(xiàn)importjava.util.*;publicclassExample17{27博學谷一一讓IT教學更簡單,讓IT學習更有效publicstaticvoidmain(String[]args){//用ArrayList存儲字符串并遍歷ArrayList<String>array=newArrayList<String>();array.add("hello");array.add("world");array.add("java");array.add(newInteger(10));//添加一個Integer類型的數(shù)據(jù),此處報編譯異常Iterator<String>it=array.iterator();while(it.hasNext()){Strings=(String)it.next();System.out.println(s);)))編譯程序發(fā)現(xiàn)報錯,如圖7-22所示。圖7-22編譯報錯錯誤顯示array中不能再存入除String類型之外的數(shù)據(jù)類型,將Integer類型數(shù)據(jù)刪掉,重新編譯運行程序,結果如圖7-23所示。圖7-23運行結果三、案例總結1、在定義集合類時,可以使用“〈參數(shù)化類型>”的方式指定該類中方法操作的數(shù)據(jù)類型,具體格式如下:ArrayList<參數(shù)化類型>list=newArrayList<參數(shù)化類型>();2、在本案例中,使用泛型規(guī)定了ArrayList集合只能存入String類型元素。需要注意的是,在使用泛型后每次遍歷集合元素時,可以指定元素類型為String,而不是Object,這樣就避免了在程序中進行強制類型轉換。3、在程序中也可以自定義泛型,自定義泛型的具體代碼如下:28博學谷一一讓IT教學更簡單,讓IT學習更有效classcachePool<T>{ /在創(chuàng)建類時,聲明參數(shù)類型為TTtemp;publicvoidsave(Ttemp){//在創(chuàng)建save()方法時,指定參數(shù)類型為Tthis.temp=temp;)publicTget(){ 在創(chuàng)建get()方法時,指定返回值類型為Treturntemp;))在定義CachePool類時,聲明了參數(shù)類型為T,例如:在實例化對象時通過<Integer>將參數(shù)T指定為Integer類型,同時在調用save()方法時傳入的數(shù)據(jù)也是Integer類型,那么調用get()方法取出的數(shù)據(jù)自然就是Integer類型,這樣做的好處是不需要進行類型轉換。案例7-18Collections類對集合的操作一、案例描述1、考核知識點編號:00107019名稱:Collections工具類2、練習目標掌握如何使用Collections類對集合進行操作3、需求分析在程序中,針對集合的操作非常頻繁,針對這些常見操作,JDK提供了一個工具類專門用來操作集合,這個類就是^^^.。為了初學者能夠熟悉Collections類中的方法,本案例將使用Collections類中的各種方法操作集合實現(xiàn)模擬斗地主發(fā)牌,來學習Collections類對集合操作的方法。4、設計思路(實現(xiàn)原理)1)編寫類Example18,創(chuàng)建兩個String類型數(shù)組,其中一個用于存儲牌的花色,一個用于存儲牌的數(shù)字2)創(chuàng)建一個ArrayList集合作為牌盒,將大小王和不同花色不同數(shù)字的牌循環(huán)添加到集合中3)用Collections工具類的shuffle()方法洗牌4)創(chuàng)建三個ArrayList集合作為三個人的牌的集合,并循環(huán)發(fā)牌,要留三張底牌5)打印出三個人的牌和集合中留的三張底牌二、案例實現(xiàn)importjava.util.*;publicclassExample18{publicstaticvoidmain(String[]args){//表示花色的數(shù)組String[]colors={"黑桃","紅桃","梅花","方塊"};29博學谷一一讓IT教學更簡單,讓IT學習更有效//表示點數(shù)的數(shù)組String口numbers={"A","2","3","4","5","6","7","8","9","10","J","Q","K");//找一個牌盒ArrayList<String>arr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論