




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章集合框架01開(kāi)篇引導(dǎo)讓我們通過(guò)一個(gè)簡(jiǎn)單而有趣的小故事來(lái)介紹Java集合的概念。在一個(gè)遙遠(yuǎn)的國(guó)度里,有一個(gè)名叫“JavaLand”的地方,這里居住著各種各樣的程序員角色,他們每天都在與代碼打交道,創(chuàng)造著各種奇妙的應(yīng)用。在這個(gè)國(guó)度里,有一個(gè)特別受歡迎的市集——“CollectionMarket”,市集上售賣著各種用來(lái)存儲(chǔ)和組織數(shù)據(jù)的“容器”,這些容器就是我們今天要講的Java集合。小明:一個(gè)年輕的Java開(kāi)發(fā)者,喜歡探索各種新的編程技術(shù)。ArrayList大叔:市集上最受歡迎的攤主之一,他賣的“ArrayList”容器能夠動(dòng)態(tài)地存儲(chǔ)任意類型的對(duì)象,就像是一個(gè)可以無(wú)限擴(kuò)容的購(gòu)物袋。HashSet小姐:她的“HashSet”容器則像是一個(gè)神奇的盒子,能夠自動(dòng)去除重復(fù)的元素,確保每個(gè)元素都是獨(dú)一無(wú)二的。LinkedList兄弟:他們聯(lián)手經(jīng)營(yíng)的“LinkedList”攤位,提供的容器能夠記住元素添加的順序,就像是一串閃閃發(fā)光的珍珠項(xiàng)鏈。小明最近接到了一個(gè)任務(wù),需要開(kāi)發(fā)一個(gè)管理圖書信息的系統(tǒng)。他首先來(lái)到了“CollectionMarket”,準(zhǔn)備挑選合適的集合來(lái)存儲(chǔ)圖書數(shù)據(jù)。遇見(jiàn)ArrayList大叔:小明首先被ArrayList大叔的攤位吸引,他了解到ArrayList可以方便地添加、刪除和訪問(wèn)元素,而且能夠動(dòng)態(tài)擴(kuò)容,非常適合用來(lái)存儲(chǔ)圖書列表。于是,他決定用ArrayList來(lái)存儲(chǔ)所有的圖書信息。遇見(jiàn)HashSet小姐:隨著系統(tǒng)的開(kāi)發(fā),小明遇到了一個(gè)問(wèn)題:他需要快速判斷一本圖書是否已經(jīng)存在于系統(tǒng)中。這時(shí),他遇到了HashSet小姐。HashSet的自動(dòng)去重和快速查找特性讓他眼前一亮,他決定用HashSet來(lái)存儲(chǔ)圖書的唯一標(biāo)識(shí)符(如ISBN號(hào)),以便快速判斷圖書是否存在。,集合是你的得力助手,它們將幫助你更好地組織和處理數(shù)據(jù)。01開(kāi)篇引導(dǎo)遇見(jiàn)LinkedList兄弟:在系統(tǒng)的某個(gè)功能中,小明需要按照?qǐng)D書的添加順序來(lái)顯示圖書列表。這時(shí),他想起了LinkedList兄弟。LinkedList不僅能存儲(chǔ)元素,還能保持元素的插入順序,這對(duì)于實(shí)現(xiàn)這個(gè)功能來(lái)說(shuō)簡(jiǎn)直是完美的選擇。故事高潮:小明利用ArrayList、HashSet和LinkedList,成功地開(kāi)發(fā)出了圖書管理系統(tǒng)。系統(tǒng)不僅能夠高效地存儲(chǔ)和檢索圖書信息,還能按照特定的順序展示圖書列表,受到了用戶的一致好評(píng)。故事結(jié)尾:通過(guò)這個(gè)項(xiàng)目,小明深刻體會(huì)到了Java集合的強(qiáng)大和靈活性。他意識(shí)到,在Java編程中,選擇合適的集合類型對(duì)于提高程序的效率和可維護(hù)性至關(guān)重要。從此,他更加熱愛(ài)Java編程,并繼續(xù)探索Java世界的奧秘。結(jié)語(yǔ):這個(gè)故事以輕松幽默的方式介紹了Java集合的概念和應(yīng)用場(chǎng)景,希望能夠激發(fā)你對(duì)Java編程的興趣和熱愛(ài)。記住,在Java的世界里,集合是你的得力助手,它們將幫助你更好地組織和處理數(shù)據(jù)。01開(kāi)篇引導(dǎo)知識(shí)要點(diǎn)掌握程度相關(guān)知識(shí)集合框架概述了解生活中的容器數(shù)組特點(diǎn)與弊端集合框架體系集合使用場(chǎng)景單列集合重點(diǎn)掌握Collection接口Iterator接口List接口Set接口雙列集合重點(diǎn)掌握Map集合概述與定義HashMap實(shí)現(xiàn)類TreeMap實(shí)現(xiàn)類HashTable實(shí)現(xiàn)類5.Properties實(shí)現(xiàn)類Collections工具類掌握Collections工具類01開(kāi)篇引導(dǎo)技能要點(diǎn)掌握程度應(yīng)用方向集合框架概述了解應(yīng)用開(kāi)發(fā)Web開(kāi)發(fā)桌面開(kāi)發(fā)大數(shù)據(jù)開(kāi)發(fā)單列集合重點(diǎn)掌握應(yīng)用開(kāi)發(fā)Web開(kāi)發(fā)桌面開(kāi)發(fā)4.大數(shù)據(jù)開(kāi)發(fā)雙列集合重點(diǎn)掌握應(yīng)用開(kāi)發(fā)Web開(kāi)發(fā)桌面開(kāi)發(fā)4.大數(shù)據(jù)開(kāi)發(fā)集合工具類掌握應(yīng)用開(kāi)發(fā)Web開(kāi)發(fā)3.桌面開(kāi)發(fā)4.大數(shù)據(jù)開(kāi)發(fā)
集合框架概述-生活的容器02集合的概述-數(shù)組的特點(diǎn)02一方面,面向?qū)ο笳Z(yǔ)言對(duì)事物的體現(xiàn)都是
以對(duì)象的形式,為了方便對(duì)多個(gè)對(duì)象的操作,就要對(duì)對(duì)象進(jìn)行存儲(chǔ)。
另一方面,使用數(shù)組存儲(chǔ)對(duì)象方面具有一些弊端,而Java集合就像一種容器,可以動(dòng)態(tài)地把多個(gè)對(duì)象的引用放入容器中。數(shù)組在內(nèi)存存儲(chǔ)方面的特點(diǎn):①數(shù)組初始化以后,長(zhǎng)度就確定了。②數(shù)組中的添加的元素是依次緊密排列的,有序的,可以重復(fù)的。③數(shù)組聲明的類型,就決定了進(jìn)行元素初始化時(shí)的類型。不是此類型的變量,就不能添加④可以存儲(chǔ)基本數(shù)據(jù)類型值,也可以存儲(chǔ)引用數(shù)據(jù)類型的變量。集合的概述-數(shù)組的弊端02數(shù)組在存儲(chǔ)數(shù)據(jù)方面的弊端:①數(shù)組初始化以后,長(zhǎng)度就不可變了,不便于擴(kuò)展。②數(shù)組中提供的屬性和方法少,不便于進(jìn)行添加、刪除、插入、獲取元素個(gè)數(shù)等操作,且效率不高。③數(shù)組存儲(chǔ)數(shù)據(jù)的特點(diǎn)單一,只能存儲(chǔ)有序的、可以重復(fù)的數(shù)據(jù)。
Java集合框架中的類可以用于存儲(chǔ)多個(gè)對(duì)象,還可用于保存具有映射關(guān)系的關(guān)聯(lián)數(shù)組。集合的概述-集合框架體系02Java集合可分為Collection(單列集合)
和Map(雙列集合)
兩大體系:(1)Collection接口:用于存儲(chǔ)一個(gè)一個(gè)的數(shù)據(jù),也稱單列數(shù)據(jù)集合。①List子接口:用來(lái)存儲(chǔ)有序的、可以重復(fù)的數(shù)據(jù)(主要用來(lái)替換數(shù)組,"動(dòng)態(tài)"數(shù)組)實(shí)現(xiàn)類:ArrayList(主要實(shí)現(xiàn)類)、LinkedList、Vector②Set子接口:用來(lái)存儲(chǔ)無(wú)序的、不可重復(fù)的數(shù)據(jù)(類似于高中講的"集合")實(shí)現(xiàn)類:HashSet(主要實(shí)現(xiàn)類)、LinkedHashSet、TreeSet(3)Map接口:用于存儲(chǔ)具有映射關(guān)系“key-value對(duì)”的集合,即一對(duì)一對(duì)的數(shù)據(jù),也稱雙列數(shù)據(jù)集合。①HashMap(主要實(shí)現(xiàn)類)②LinkedHashMap③TreeMap④Hashtable⑤Properties集合的概述-集合框架體系02JDK提供的集合API位于java.util包內(nèi),如圖11-2所示Java體系結(jié)構(gòu)。集合框架概述-集合使用場(chǎng)景02(1)移動(dòng)應(yīng)用領(lǐng)域(集成Android平臺(tái)):Java在Android端是主要開(kāi)發(fā)的語(yǔ)言,占有重要的地位。(2)企業(yè)級(jí)應(yīng)用領(lǐng)域(JavaEE后臺(tái)):用來(lái)開(kāi)發(fā)企業(yè)級(jí)的應(yīng)用程序,大型網(wǎng)站如淘寶、京東、12306,以及各大物流、銀行、金融、社交、醫(yī)療、交通、各種OA系統(tǒng)等都是用JavaEE技術(shù)開(kāi)發(fā)的。(3)大數(shù)據(jù)分析、人工智能領(lǐng)域:流行的大數(shù)據(jù)框架,如Hadoop、Flink都是用Java編寫的。Spark使用Scala編寫,但可以用Java開(kāi)發(fā)應(yīng)用。單列集合-Collection接口03JDK不提供此接口的任何直接實(shí)現(xiàn),而是提供更具體的子接口(如:Set和List)去實(shí)現(xiàn)。Collection接口是List和Set接口的父接口,該接口里定義的方法既可用于操作Set集合,也可用于操作List集合。方法如下:(1)add(Eobj):添加元素對(duì)象到當(dāng)前集合中
。【例11-1】創(chuàng)建一個(gè)集合類,實(shí)現(xiàn)將元素添加到當(dāng)前集合中,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();collectionDemo.testAdd();}publicvoidtestAdd(){//ArrayList類是Collection接口的實(shí)現(xiàn)類Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");System.out.println(collection);}}在上述代碼中,可以看出使用add方法可以將元素添加到Collection集合中,因?yàn)镃ollection是接口不能直接創(chuàng)建對(duì)象,選擇使用ArrayList實(shí)現(xiàn)類創(chuàng)建對(duì)象。單列集合-Collection接口03(2)addAll(Collectionother):添加other集合中的所有元素對(duì)象到當(dāng)前集合中?!纠?1-2】創(chuàng)建兩個(gè)集合類Collection01和Collection02,實(shí)現(xiàn)將Collection02集合元素添加到Collection01集合中,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();//collectionDemo.testAdd();collectionDemo.testAddAll();}publicvoidtestAdd(){//ArrayList類是Collection接口的實(shí)現(xiàn)類Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");System.out.println(collection);}
單列集合-Collection接口03publicvoidtestAddAll(){//ArrayList類是Collection接口的實(shí)現(xiàn)類Collectioncollection01=newArrayList();collection01.add("畫畫");collection01.add("花花");//System.out.println(collection01);Collectioncollection02=newArrayList();collection02.add("西西");collection02.add("南南");//System.out.println(collection01);//將collection02集合的元素全部添加到collection01集合中collection01.addAll(collection02);System.out.println(collection01);}}add方法是將元素添加到集合中,addAll的方法將另一個(gè)集合中元素添加到當(dāng)前集合中。在上述代碼中,可以看出使用addAll方法可以將Collection02元素添加到Collection01集合中,因?yàn)镃ollection01接口和Collection02接口
是接口不能直接創(chuàng)建對(duì)象,選擇使用ArrayList實(shí)現(xiàn)類創(chuàng)建對(duì)象。單列集合-Collection接口03(3)intsize();獲取當(dāng)前集合中實(shí)際存儲(chǔ)的元素個(gè)數(shù)
。(4)booleanisEmpty():判斷當(dāng)前集合是否為空集合?!纠?1-3】創(chuàng)建一個(gè)集合類,實(shí)現(xiàn)獲取到集合類的元素個(gè)數(shù)和判斷這個(gè)元素是否為空,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();collectionDemo.testSizeIsEmpty();}publicvoidtestSizeIsEmpty(){//ArrayList類是Collection接口的實(shí)現(xiàn)類Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");intsize=collection.size();System.out.println("這個(gè)集合的元素個(gè)數(shù)為:"+size);booleanempty=collection.isEmpty();System.out.println("這個(gè)集合是否為空:"+empty);}}在上述代碼中,調(diào)用了size()方法,實(shí)現(xiàn)了集合類的元素個(gè)數(shù),調(diào)用isEmpty()方法實(shí)現(xiàn)了這個(gè)集合的元素是否為空。”。單列集合-Collection接口03(5)booleancontains(Objectobj):判斷當(dāng)前集合中是否存在一個(gè)與obj對(duì)象equals返回true的元素
。(6)booleancontainsAll(Collectioncoll):判斷coll集合中的元素是否在當(dāng)前集合中都存在。即coll集合是否是當(dāng)前集合的“子集”。【例11-4】創(chuàng)建一個(gè)集合類,實(shí)現(xiàn)判斷當(dāng)前集合是否包含另一個(gè)集合的元素和判斷這個(gè)集合元素是否在當(dāng)前集合中存在,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();collectionDemo.testContains();}publicvoidtestContains(){//ArrayList類是Collection接口的實(shí)現(xiàn)類Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");booleancol=collection.contains("畫畫");System.out.println("這個(gè)集合是否包含元素:"+col);Collectioncollection02=newArrayList();collection02.add("畫畫");collection02.add("花花");booleanb=collection.containsAll(collection02);System.out.println("這個(gè)集合是否包含其他集合的元素:"+b);}}在上述代碼中,調(diào)用contains()方法(5)判斷當(dāng)前集合中是否存在一個(gè)與obj對(duì)象equals返回true的元素
。調(diào)用containsAll()方法判斷coll集合中的元素是否在當(dāng)前集合中都存在。兩個(gè)方法主要區(qū)別是contains()方法判斷是當(dāng)前集合是否包含這個(gè)元素,如果包含返回true,如果沒(méi)有包含返回false,containsAll()方法是判斷其他集合中元素是否在當(dāng)前元素中都存在,如果其中有一個(gè)元素不存在,返回的依然是false,如果全部存在,返回的是true。單列集合-Collection接口03【例11-5】創(chuàng)建集合類,實(shí)現(xiàn)判斷當(dāng)前集合是否包含另一個(gè)集合的元素和判斷這個(gè)集合元素是否在當(dāng)前集合中存在,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();collectionDemo.testContains();}publicvoidtestContains(){//ArrayList類是Collection接口的實(shí)現(xiàn)類Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");booleancol=collection.contains("畫畫");System.out.println("這個(gè)集合是否包含元素:"+col);Collectioncollection02=newArrayList();collection02.add("畫畫");collection02.add("花花");booleanb=collection.containsAll(collection02);System.out.println("這個(gè)集合是否包含其他集合的元素:"+b);}}在上述代碼中,調(diào)用contains()方法(5)判斷當(dāng)前集合中是否存在一個(gè)與obj對(duì)象equals返回true的元素
。調(diào)用containsAll()方法判斷coll集合中的元素是否在當(dāng)前集合中都存在。兩個(gè)方法主要區(qū)別是contains()方法判斷是當(dāng)前集合是否包含這個(gè)元素,如果包含返回true,如果沒(méi)有包含返回false,containsAll()方法是判斷其他集合中元素是否在當(dāng)前元素中都存在,如果其中有一個(gè)元素不存在,返回的依然是false,如果全部存在,返回的是true。單列集合-Collection接口03(7)booleanremove(Objectobj):從當(dāng)前集合中刪除第一個(gè)找到的與obj對(duì)象equals返回true的元素。(8)booleanretainAll(Collectioncoll):從當(dāng)前集合中刪除兩個(gè)集合中不同的元素?!纠?1-6】創(chuàng)建集合類,實(shí)現(xiàn)從當(dāng)前集合中刪除第一個(gè)找到的與obj對(duì)象equals返回true的元素、從當(dāng)前集合中刪除所有與coll集合中相同的元素和從當(dāng)前集合中刪除兩個(gè)集合中不同的元素,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();collectionDemo.testRemove();}
在上述代碼中,調(diào)用contains()方法(5)判斷當(dāng)前集合中是否存在一個(gè)與obj對(duì)象equals返回true的元素
。調(diào)用containsAll()方法判斷coll集合中的元素是否在當(dāng)前集合中都存在。兩個(gè)方法主要區(qū)別是contains()方法判斷是當(dāng)前集合是否包含這個(gè)元素,如果包含返回true,如果沒(méi)有包含返回false,containsAll()方法是判斷其他集合中元素是否在當(dāng)前元素中都存在,如果其中有一個(gè)元素不存在,返回的依然是false,如果全部存在,返回的是true。單列集合-Collection接口03publicvoidtestRemove(){//ArrayList類是Collection接口的實(shí)現(xiàn)類Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");collection.add("哈哈");System.out.println(collection);/*booleanb=collection.remove("畫畫");System.out.println("刪除當(dāng)前集合中的元素:"+b);System.out.println(collection);*/Collectioncollection02=newArrayList();collection02.add("南南");collection02.add("花花");collection02.add("西西");collection02.add("哈哈");System.out.println(collection02);booleanb=collection02.removeAll(collection);System.out.println("在其他集合中刪除當(dāng)前集合中相同的元素:"+b);System.out.println(collection02);/*System.out.println(collection02);booleanb1=collection02.retainAll(collection);System.out.println("在其他集合中刪除當(dāng)前集合中不同的元素:"+b1);System.out.println(collection02);*/}}在上述代碼中,我們可以看出調(diào)用remove()方法是刪除當(dāng)前集合中的元素,調(diào)用removeAll()刪除其他集合中與當(dāng)前集合中相同的元素,調(diào)用retainAll()方法是刪除其他集合中與當(dāng)前集合中不同的元素。單列集合-Collection接口03(9)voidclear():清空集合元素?!纠?1-7】創(chuàng)建集合類,實(shí)現(xiàn)清空集合元素,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();collectionDemo.testClear();}publicvoidtestClear(){Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");collection.add("哈哈");System.out.println(collection);collection.clear();System.out.println(collection);}}在上述代碼中,可以看出調(diào)用clear(0方法可以實(shí)現(xiàn)清空集合。單列集合-Collection接口03(10)Object[]toArray():返回包含當(dāng)前集合中所有元素的數(shù)組。【例11-8】創(chuàng)建集合類,實(shí)現(xiàn)將集合轉(zhuǎn)換為數(shù)組,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();collectionDemo.testtoArray();}publicvoidtesttoArray(){Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");collection.add("哈哈");System.out.println(collection);Object[]array=collection.toArray();for(Objecto:array){System.out.println(o);}}}在上述代碼中,調(diào)用toArray()方法,實(shí)現(xiàn)集合轉(zhuǎn)換為數(shù)組的形式。單列集合-Iterator接口032.Iterator接口與Collection接口的區(qū)別Iterator與Collection、Map接口有所不同。Iterator,被稱為迭代器接口,本身并不提供存儲(chǔ)對(duì)象的能力,主要用于遍歷Collection中的元素。Collection接口與Map接口主要用于存儲(chǔ)元素。(1)Collection接口繼承了java.lang.Iterable接口,該接口有一個(gè)iterator()方法,那么所有實(shí)現(xiàn)了Collection接口的集合類都有一個(gè)iterator()方法,用以返回一個(gè)實(shí)現(xiàn)了Iterator接口的對(duì)象。①publicIteratoriterator():獲取集合對(duì)應(yīng)的迭代器,用來(lái)遍歷集合中的元素的。②集合對(duì)象每次調(diào)用iterator()方法都得到一個(gè)全新的迭代器對(duì)象,默認(rèn)游標(biāo)都在集合的第一個(gè)元素之前。(2)Iterator接口的常用方法如下:①publicEnext():返回迭代的下一個(gè)元素。②publicbooleanhasNext():如果仍有元素可以迭代,則返回true。單列集合-Iterator接口03【例11-9】創(chuàng)建集合類,實(shí)現(xiàn)集合的遍歷,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();collectionDemo.testIterator();}publicvoidtestIterator(){Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");collection.add("哈哈");Iteratoriterator=collection.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}}在上述代碼中,調(diào)用iterator()方法,可以實(shí)現(xiàn)集合的遍歷,調(diào)用hasNext()方法判斷是否有元素可以遍歷,如果有返回true,調(diào)用next()方法返回迭代的下一個(gè)元素。在調(diào)用it.next()方法之前必須要調(diào)用it.hasNext()進(jìn)行檢測(cè)。若不調(diào)用,且下一條記錄無(wú)效,直接調(diào)用it.next()會(huì)拋出NoSuchElementException異常。單列集合-Iterator接口033.foreach循環(huán)foreach循環(huán)(也稱增強(qiáng)for循環(huán))是JDK5.0中定義的一個(gè)高級(jí)for循環(huán),專門用來(lái)遍歷數(shù)組和集合的。語(yǔ)法結(jié)構(gòu)如下:for(元素的數(shù)據(jù)類型
局部變量:Collection集合或數(shù)組){ //操作局部變量的輸出操作}【例11-10】創(chuàng)建集合類,使用foreach循環(huán)遍歷,代碼如下:packagecom.chapter11.collection;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassCollectionDemo{publicstaticvoidmain(String[]args){CollectionDemocollectionDemo=newCollectionDemo();collectionDemo.testForeach();}publicvoidtestForeach(){Collectioncollection=newArrayList();collection.add("畫畫");collection.add("花花");collection.add("哈哈");for(Objecto:collection){System.out.println(o);}}}在上述代碼中,使用foreach循環(huán)進(jìn)行遍歷集合,foreach循環(huán)也叫做增強(qiáng)for循環(huán)。4.for循環(huán)在5.1章節(jié)中已講解過(guò)。單列集合-List接口031.List接口的概述與定義鑒于Java中數(shù)組用來(lái)存儲(chǔ)數(shù)據(jù)的局限性,我們通常使用java.util.List替代數(shù)組。List集合類中元素有序、且可重復(fù),集合中的每個(gè)元素都有其對(duì)應(yīng)的順序索引。舉例:List集合存儲(chǔ)數(shù)據(jù),就像銀行門口客服,給每一個(gè)來(lái)辦理業(yè)務(wù)的客戶分配序號(hào):第一個(gè)來(lái)的是“張三”,客服給他分配的是0;第二個(gè)來(lái)的是“李四”,客服給他分配的1;以此類推,最后一個(gè)序號(hào)應(yīng)該是“總?cè)藬?shù)-1”,如圖11-4所示單列集合-List接口032.List接口常用的方法List除了從Collection集合繼承的方法外,List集合里添加了一些根據(jù)索引來(lái)操作集合元素的方法。(1)插入元素①voidadd(intindex,Objectele):在index位置插入ele元素②booleanaddAll(intindex,Collectioneles):從index位置開(kāi)始將eles中的所有元素添加進(jìn)來(lái)(2)獲取元素①Objectget(intindex):獲取指定index位置的元素②ListsubList(intfromIndex,inttoIndex):返回從fromIndex到toIndex位置的子集合(3)獲取元素索引①intindexOf(Objectobj):返回obj在集合中首次出現(xiàn)的位置②intlastIndexOf(Objectobj):返回obj在當(dāng)前集合中末次出現(xiàn)的位置(4)刪除和替換元素①Objectremove(intindex):移除指定index位置的元素,并返回此元素②Objectset(intindex,Objectele):設(shè)置指定index位置的元素為ele單列集合-List接口03【例11-11】創(chuàng)建集合類,實(shí)現(xiàn)List接口添加元素、獲取元素、獲取元素的索引以及刪除和替換元素,代碼如下:packagecom.chapter11.list;importjava.util.ArrayList;importjava.util.Collection;importjava.util.List;publicclassListDemo{publicstaticvoidmain(String[]args){ListDemolistDemo=newListDemo();listDemo.testList();}publicvoidtestList(){System.out.println("=============List集合添加元素===============");Listlist=newArrayList();list.add(1);list.add("hello");list.add("world");System.out.println("添加元素:"+list);System.out.println("=============Collection添加元素===============");Collectioncollection=newArrayList();
單列集合-List接口03collection.add("南南");System.out.println("=============將Collection集合元素添加到List集合指定的位置===============");//在指定的位置,添加集合中元素到當(dāng)前集合中l(wèi)ist.addAll(2,collection);System.out.println("=============獲取元素===============");System.out.println(list);Objecto=list.get(2);System.out.println("=============獲取元素指定位置的元素===============");System.out.println("獲取元素:"+o);ListsubList=list.subList(0,3);System.out.println(subList);System.out.println("=============獲取元素的第一次出現(xiàn)的索引===============");inti=list.indexOf("hello");System.out.println(i);System.out.println("=============獲取元素的末尾出現(xiàn)的索引===============");inti1=list.lastIndexOf("world");System.out.println(i1);System.out.println("=============刪除集合的元素==============");booleanhello=list.remove("hello");System.out.println(hello);System.out.println("=============修改集合的元素==============");list.set(1,"xixi");System.out.println(list);}}在上述代碼中,調(diào)用add()方法實(shí)現(xiàn)集合添加元素,調(diào)用addAll()方法實(shí)現(xiàn)將其他集合中元素添加到當(dāng)前元素中,調(diào)用get()方法獲取當(dāng)前集合的元素,調(diào)用subList()方法獲取指定元素,調(diào)用indexOf()方法實(shí)現(xiàn)集合第一次出現(xiàn)元素的索引,調(diào)用lastIndexOf()獲取元素末尾出現(xiàn)的索引,調(diào)用remove()方法刪除集合元素,remove方法的參數(shù)可以是索引,還可以是刪除的元素,調(diào)用set()方法進(jìn)行修改集合的元素。在JavaSE中List名稱的類型有兩個(gè),一個(gè)是java.util.List集合接口,一個(gè)是java.awt.List圖形界面的組件,別導(dǎo)錯(cuò)包了。單列集合-List接口033.ArrayList實(shí)現(xiàn)類的概述與定義JDKAPI中List接口的實(shí)現(xiàn)類常用的有:ArrayList、LinkedList和Vector。ArrayList是List接口的主要實(shí)現(xiàn)類。本質(zhì)上,ArrayList是對(duì)象引用的一個(gè)”變長(zhǎng)”數(shù)組,如圖11-5所示ArrayList實(shí)現(xiàn)類的方法與List接口的方法基本上全是一致的,直接使用List接口的方法即可。單列集合-List接口034.LinkedList實(shí)現(xiàn)類的概述與定義對(duì)于頻繁的插入或刪除元素的操作,建議使用LinkedList類,效率較高。這是由底層采用鏈表(雙向鏈表)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)決定的。
5.LinkedList實(shí)現(xiàn)類的特有的方法LinkedList實(shí)現(xiàn)類與ArrayList不同的是ArrayList實(shí)現(xiàn)類使用的是List接口的方法,而LinkedList實(shí)現(xiàn)類即使用了List接口的方法,也有自己特有的方法,如下是LinkedList實(shí)現(xiàn)類特有的方法:voidaddFirst(Objectobj)voidaddLast(Objectobj)ObjectgetFirst()ObjectgetLast()ObjectremoveFirst()ObjectremoveLast()【例11-12】創(chuàng)建集合類,實(shí)現(xiàn)LinkedList在首位添加元素和末尾添加元素、獲取第一個(gè)元素和末尾的元素、刪除第一個(gè)元素和刪除出末尾元素,代碼如下:packagecom.chapter11.list;importjava.util.LinkedList;importjava.util.List;單列集合-List接口03publicclassListDemo02{publicstaticvoidmain(String[]args){ListDemo02listDemo02=newListDemo02();listDemo02.testList();}publicvoidtestList(){System.out.println("=================添加元素==================");LinkedListlist=newLinkedList<>();list.add("a");list.addFirst("b");list.add("c");list.add("d");list.addLast("f");System.out.println(list);System.out.println("=================獲取元素==================");Objectfirst=list.getFirst();System.out.println(first);Objectlast=list.getLast();System.out.println(last);System.out.println("=================刪除元素==================");Objecto=list.removeFirst();System.out.println(o);Objecto1=list.removeLast();System.out.println(o1);}}在上述代碼中,調(diào)用addFirst()方法實(shí)現(xiàn)了將元素添加到首位,調(diào)用addLast()方法實(shí)現(xiàn)了將元素添加到末尾,調(diào)用getFirst()方法實(shí)現(xiàn)了獲取首位的元素,調(diào)用getLast()方法實(shí)現(xiàn)了獲取末尾的元素,調(diào)用removeFirst()方法實(shí)現(xiàn)了刪除首位的元素,調(diào)用removeLast()方法實(shí)現(xiàn)了刪除末尾的元素。單列集合-Set實(shí)現(xiàn)類031.Set接口的概述與定義Set接口是Collection的子接口,Set接口相較于Collection接口沒(méi)有提供額外的方法.,Set集合不允許包含相同的元素,如果試把兩個(gè)相同的元素加入同一個(gè)Set集合中,則添加操作失敗。Set集合支持的遍歷方式和Collection集合一樣:foreach和Iterator。?Set的常用實(shí)現(xiàn)類有:HashSet、TreeSet、LinkedHashSet。2.HashSet實(shí)現(xiàn)類HashSet是Set接口的主要實(shí)現(xiàn)類,大多數(shù)時(shí)候使用Set集合時(shí)都使用這個(gè)實(shí)現(xiàn)類,HashSet按Hash算法來(lái)存儲(chǔ)集合中的元素,因此具有很好的存儲(chǔ)、查找、刪除性能。不能保證元素的排列順序,HashSet不是線程安全的,集合元素可以是null。單列集合-Set實(shí)現(xiàn)類03【例11-13】創(chuàng)建集合類,實(shí)現(xiàn)HashSet集合中基本的功能,代碼如下:packagecom.chapter11.set;importjava.util.HashSet;publicclassSetDemo{publicstaticvoidmain(String[]args){SetDemosetDemo=newSetDemo();setDemo.testSet();}publicvoidtestSet(){HashSethashSet=newHashSet();hashSet.add("a");hashSet.add("b");hashSet.add("c");System.out.println(hashSet);}}在上述代碼中,調(diào)用add()方法實(shí)現(xiàn)了元素添加,使用的是Collection對(duì)象的方法。在Set集合中沒(méi)有修改的方法。其他的方法查看Collection對(duì)象的方法,直接使用即可。HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn):兩個(gè)對(duì)象通過(guò)hashCode()方法得到的哈希值相等,并且兩個(gè)對(duì)象的equals()方法返回值為true。對(duì)于存放在Set容器中的對(duì)象,對(duì)應(yīng)的類一定要重寫hashCode()和equals(Objectobj)方法,以實(shí)現(xiàn)對(duì)象相等規(guī)則。即:“相等的對(duì)象必須具有相等的散列碼”。HashSet集合中元素的無(wú)序性,不等同于隨機(jī)性。這里的無(wú)序性與元素的添加位置有關(guān)。具體來(lái)說(shuō):我們?cè)谔砑用恳粋€(gè)元素到數(shù)組中時(shí),具體的存儲(chǔ)位置是由元素的hashCode()調(diào)用后返回的hash值決定的。導(dǎo)致在數(shù)組中每個(gè)元素不是依次緊密存放的,表現(xiàn)出一定的無(wú)序性。單列集合-Set實(shí)現(xiàn)類03【例11-14】創(chuàng)建集合類和學(xué)生類,在HashSet集合中判斷兩個(gè)對(duì)象是否相等,代碼如下:packagecom.chapter11.set;importjava.util.Objects;publicclassStudent{privateIntegerid;privateStringname;privateIntegerage;publicStudent(Integerid,Stringname,Integerage){this.id=id;=name;this.age=age;}publicStudent(){}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetName(){returnname;}
單列集合-Set實(shí)現(xiàn)類03publicvoidsetName(Stringname){=name;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Studentstudent=(Student)o;returnObjects.equals(id,student.id)&&Objects.equals(name,)&&Objects.equals(age,student.age);}@OverridepublicinthashCode(){returnObjects.hash(id,name,age);}
單列集合-Set實(shí)現(xiàn)類03@OverridepublicStringtoString(){return"Student{"+"id="+id+",name='"+name+'\''+",age="+age+'}';}}packagecom.chapter11.set;importjava.util.HashSet;publicclassSertDemo02{publicstaticvoidmain(String[]args){Studentstudent=newStudent(1,"張三",20);Studentstudent02=newStudent(1,"張三",20);HashSethashSet=newHashSet();hashSet.add(student);hashSet.add(student02);System.out.println(hashSet);}}在上述代碼中,創(chuàng)建Student類,在Student類中實(shí)現(xiàn)了hashCode()方法和equals()方法,兩個(gè)對(duì)象通過(guò)hashCode()方法得到的哈希值相等,并且兩個(gè)對(duì)象的equals()方法返回值為true。所以在添加到HashSet集合中,如果是相等的兩個(gè)對(duì)象,只能添加一個(gè)對(duì)象。小貼士:如果兩個(gè)元素的equals()方法返回true,但它們的hashCode()返回值不相等,hashSet將會(huì)把它們存儲(chǔ)在不同的位置,但依然可以添加成功。重寫equals方法的時(shí)候一般都需要同時(shí)重寫hashCode方法。通常參與計(jì)算hashCode的對(duì)象的屬性也應(yīng)該參與到equals()中進(jìn)行計(jì)算。開(kāi)發(fā)中直接使用IDEA里的快捷鍵自動(dòng)重寫equals()和hashCode()方法即可。單列集合-TreeSet實(shí)現(xiàn)類03TreeSet是SortedSet接口的實(shí)現(xiàn)類,TreeSet可以按照添加的元素的指定的屬性的大小順序進(jìn)行遍歷,TreeSet底層使用紅黑樹(shù)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。TreeSet實(shí)現(xiàn)類不允許重復(fù)、實(shí)現(xiàn)排序(自然排序或定制排序),TreeSet實(shí)現(xiàn)類新增的方法如下:(1)Comparatorcomparator()(2)Objectfirst()(3)Objectlast()(4)Objectlower(Objecte)(5)Objecthigher(Objecte)(6)SortedSetsubSet(fromElement,toElement)(7)SortedSetheadSet(toElement)(8)SortedSettailSet(fromElement)TreeSet兩種排序方法:自然排序和定制排序。默認(rèn)情況下,TreeSet采用自然排序。(1)自然排序:TreeSet會(huì)調(diào)用集合元素的compareTo(Objectobj)方法來(lái)比較元素之間的大小關(guān)系,然后將集合元素按升序(默認(rèn)情況)排列。【例11-15】創(chuàng)建集合類和學(xué)生類,按照對(duì)象中的年齡從小到大進(jìn)行排序,使用的是自然排序,代碼如下:packagecom.chapter11.set;importjava.util.Comparator;importjava.util.Objects;單列集合-TreeSet實(shí)現(xiàn)類03publicclassStudentimplementsComparable{privateIntegerid;privateStringname;privateIntegerage;publicStudent(Integerid,Stringname,Integerage){this.id=id;=name;this.age=age;}publicStudent(){}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetName(){returnname;}單列集合-TreeSet實(shí)現(xiàn)類03publicvoidsetName(Stringname){=name;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Studentstudent=(Student)o;returnObjects.equals(id,student.id)&&Objects.equals(name,)&&Objects.equals(age,student.age);}@OverridepublicinthashCode(){returnObjects.hash(id,name,age);}單列集合-TreeSet實(shí)現(xiàn)類03@OverridepublicStringtoString(){return"Student{"+"id="+id+",name='"+name+'\''+",age="+age+'}';}@OverridepublicintcompareTo(Objecto){if(this==o){return0;}if(oinstanceofStudent){Studentstudent=(Student)o;intvalue=this.age-student.age;if(value!=0){returnvalue;}return-pareTo();}thrownewRuntimeException("輸入的類型不匹配");}}單列集合-TreeSet實(shí)現(xiàn)類03packagecom.chapter11.set;importjava.util.TreeSet;publicclassSertDemo03{publicstaticvoidmain(String[]args){Studentstudent=newStudent(1,"王五",20);Studentstudent02=newStudent(2,"張三",30);Studentstudent04=newStudent(4,"笑笑",24);Studentstudent03=newStudent(3,"小花",33);TreeSettreeSet=newTreeSet();treeSet.add(student);treeSet.add(student02);treeSet.add(student03);treeSet.add(student04);System.out.println(treeSet);}}在上述代碼中,把一個(gè)對(duì)象添加到TreeSet時(shí),則該對(duì)象的類必須實(shí)現(xiàn)Comparable接口,實(shí)現(xiàn)Comparable的類必須實(shí)現(xiàn)compareTo(Objectobj)方法,兩個(gè)對(duì)象即通過(guò)compareTo(Objectobj)方法的返回值來(lái)比較大小。單列集合-TreeSet實(shí)現(xiàn)類03(2)定制排序:如果元素所屬的類沒(méi)有實(shí)現(xiàn)Comparable接口,或不希望按照升序(默認(rèn)情況)的方式排列元素或希望按照其它屬性大小進(jìn)行排序,則考慮使用定制排序。定制排序,通過(guò)Comparator接口來(lái)實(shí)現(xiàn)。需要重寫compare(To1,To2)方法?!纠?1-16】創(chuàng)建集合類和學(xué)生類,按照對(duì)象中的年齡從小到大進(jìn)行排序,使用的是定制排序,代碼如下:packagecom.chapter11.set;importjava.util.Comparator;importjava.util.TreeSet;publicclassSertDemo04{publicstaticvoidmain(String[]args){Student02student=newStudent02(1,"王五",20);Student02student02=newStudent02(2,"張三",30);Student02student04=newStudent02(4,"笑笑",24);Student02student03=newStudent02(3,"小花",33);Comparatorcomparator=newComparator(){@Overridepublicintcompare(Objecto1,Objecto2){if(o1instanceofStudent02&&o2instanceofStudent02){Student02student021=(Student02)o1;Student02student022=(Student02)o2;intvalue=student021.getAge()-student022.getAge();if(value!=0){returnvalue;}
單列集合-TreeSet實(shí)現(xiàn)類03returnstudent021.getName().compareTo(student022.getName());}thrownewRuntimeException("輸入的類型不匹配");}};TreeSettreeSet=newTreeSet(comparator);treeSet.add(student);treeSet.add(student02);treeSet.add(student03);treeSet.add(student04);System.out.println(treeSet);}}在上述代碼中,利用intcompare(To1
溫馨提示
- 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年機(jī)關(guān)事務(wù)管理局資產(chǎn)運(yùn)營(yíng)公司經(jīng)理招聘筆試專項(xiàng)練習(xí)含答案
- 2025年中海油縣片區(qū)“加油站+文旅+直播”項(xiàng)目經(jīng)理競(jìng)聘面試預(yù)測(cè)題及答案
- 殘聯(lián)干事招聘面試經(jīng)典題及答案
- 2025 年太原市一年級(jí)英語(yǔ)秋季期末測(cè) - 基礎(chǔ)卷及答案(外研版)
- 九上語(yǔ)文第2課《周總理你在哪里》課件
- 2025官方版房屋租賃合同模板
- 自媒體推廣聯(lián)營(yíng)合同
- 2025年法律職業(yè)資格考試高分題庫(kù)附答案詳解(模擬題)
- 2025年高職院校保衛(wèi)處招聘面試專項(xiàng)練習(xí)含答案
- 2025年村級(jí)水管員(農(nóng)村供水方向)招聘筆試專項(xiàng)練習(xí)含答案
- 人教版初中九年級(jí)全冊(cè)英語(yǔ)單詞表(完整版)
- 合伙人股權(quán)激勵(lì)制度
- 導(dǎo)尿管相關(guān)尿路感染預(yù)防與控制
- 《新媒體寫作與傳播(第2版)》教學(xué)大綱、課程標(biāo)準(zhǔn)、習(xí)題答案
- 骨質(zhì)疏松癥完整版本
- 國(guó)企投資后評(píng)價(jià)操作實(shí)務(wù)
- 《頭發(fā)頭皮生理學(xué)》課件
- 中國(guó)古代文學(xué)史明代文學(xué)
- 磨光機(jī)使用安全培訓(xùn)
- 有限空間專項(xiàng)安全檢查表
- 艦艇損害管制與艦艇損害管制訓(xùn)練
評(píng)論
0/150
提交評(píng)論