java高手訓(xùn)練營(yíng)版12.10集合類_第1頁(yè)
java高手訓(xùn)練營(yíng)版12.10集合類_第2頁(yè)
java高手訓(xùn)練營(yíng)版12.10集合類_第3頁(yè)
java高手訓(xùn)練營(yíng)版12.10集合類_第4頁(yè)
java高手訓(xùn)練營(yíng)版12.10集合類_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

集合類概集合類是Java中十分實(shí)用的一些工具類。這些類可以用來對(duì)象,而且長(zhǎng)度是可集合類體Collection接口是所有集合接口的父接口,Collection接口有兩個(gè)子接口:List和Set。集合類中還有一個(gè)接口,Map,但是這個(gè)接口沒有繼承CollectionMap中的方法稍那么,List、Set、Map之間有什么區(qū)別呢List:對(duì)象是有序的,可以重Set:對(duì)象是無(wú)序的,不可以重Map 本章集合類是Java的工具類,用于對(duì)象,長(zhǎng)度可Collection接口有List和SetMap接口屬于集合類,但是不繼承Collection接Collection接口概在上一節(jié)中提到了,Collection是List和Set接口的父接口,所以說Collection接口中的方注意:大家在查閱相關(guān)集合類的API文檔時(shí),可能會(huì)見到類似<E>、<T>、<K,V>等。這Collection接口方法概booleanadd(Objectobj); booleanaddAll(Collectionc); voidclear(); booleancontains(Object booleancontainsAll(Collection boolean Iterator booleanremove(Objecto); booleanremoveAll(Collectionc)//如果集合中含有c中的所有對(duì)象,刪除,并返回trueintsize(); Object 由于Collection是接口,不能實(shí)例化,演示使用CollectionListimportpublicclassCollectionDemopublicstaticvoidmain(String[]args)//Collectioncollection=newCollectioncollection2=new//

Object[]arr=for(intx=0;x<arr.length;System.out.println("collection2的第x1元素是:}}}Eclipse當(dāng)中這段程序大部在這個(gè)程序當(dāng)中,我對(duì)collection和collection2這兩個(gè)實(shí)例使用了Collection接口的方法來進(jìn)行增刪改查等操作。這些方法也是List和Set的基本方法。那么,如何對(duì)Collection接口中的元素進(jìn)行遍歷呢?Collection接口為我們提供Iterator接本章Collection接口是List和SetCollection中的方法基本都是增刪改查,例如add()、remove()、contains()Iterator接口Iterator接口稱作迭代器。每一個(gè)Collection都會(huì)有一個(gè)與之對(duì)應(yīng)的Iterator。迭代器用于按順序獲取一個(gè)Collection中的元素,十分常用。不過,Iterator是接口,不可能直接new出來。Collection接口中的iterator()方返回與Iterator中的Iterator Iterator中有兩個(gè)常用方法booleanhasNext(); Objectnext(); 使用這兩個(gè)方法,可以方便的將Collectionwhile循環(huán),以hasNext()為循環(huán)條件,打印next()。importpublicclassIteratorDemopublicstaticvoidmain(String[]{Collectionc=new將三個(gè)元素添加至c//Iteratorit=while(it.hasNext())}}}

Stringstr=(String)it.next();在這個(gè)程序當(dāng)中,最后的while循環(huán)以it.hasNext(),也就是是否還有元素可以取出為條不是String,我們還將其向下轉(zhuǎn)換為String,就會(huì)出現(xiàn)ClassCastException。我們以后學(xué)習(xí)迭代器的迭代器的原理其實(shí)很簡(jiǎn)單。在獲取到Collection中的元后,會(huì)有一個(gè)指針放置在第一個(gè)元前。由于指針后面還有元素,hasNext()返回true,next()便會(huì)返回指針后面的元每當(dāng)next()獲取指針后面的元后,指針會(huì)走到第一個(gè)元后,第二個(gè)元前。然本章小Iterator(迭代器)接口用于遍歷Collection迭代器中的hasNext()方法用于判斷還有沒有元素可以取List接口List接口是Collection接口的子接口,是集合類中必不可少的接口。List字面上指的是“列表”、“”等,這個(gè)接口的特點(diǎn)也是如此。List中的元素是按順序一個(gè)一個(gè)排列的,每一個(gè)元素都有自己的下標(biāo)(和數(shù)組差不多),因此,List接口的方法比Set一節(jié),我們就來重點(diǎn)學(xué)下List接口的特有方法。List接口特有因?yàn)長(zhǎng)ist接口是Collection的子接口,Collection接口中的方法全都被繼承過來了。然而關(guān)于Collection接口的方法我們已經(jīng)講過了,所以我們今天只講List的特有方法。voidadd(intindex,Objectelement); booleanaddAll(intindex,Collectionc); Objectget(intindex); intindexOf(Object ListIterator Objectremove(int booleanremove(Objecto); Objectset(intindex,Objectelement); 聯(lián)(畢竟只有List有下標(biāo))。importpublicclassListDemopublicstaticvoidmain(String[]{Listl=newl.add(2,"插入的元素");Iteratori=l.iterator();}}}在這個(gè)程序當(dāng)中,我對(duì)List的特有方法進(jìn)行了一個(gè)示范。通過這個(gè)程序,我們可以發(fā)現(xiàn)本章List實(shí)現(xiàn)類概List是一個(gè)接口,真正開發(fā)的時(shí)候肯定不能直接使用這個(gè)接口。真正實(shí)用的是實(shí)現(xiàn)這個(gè)接竟這些方法可以通過API查詢。我們重點(diǎn)講的是實(shí)現(xiàn)類的特點(diǎn)。Vector三個(gè)實(shí)現(xiàn)類數(shù)據(jù)的特ArrayList對(duì)象的方式是通過像數(shù)組一樣的下標(biāo),對(duì)每一個(gè)對(duì)象進(jìn)行排列。Vector類也是這樣。兩者的區(qū)別在于,ArrayList是線程異步的,Vector是線程同步的。我們還沒有學(xué)到多線程,線程同步機(jī)制自然也沒有學(xué)過。簡(jiǎn)單來說:在多線程環(huán)境中,ArrayList的程序),就應(yīng)當(dāng)使用ArrayList。如果是多線程,應(yīng)當(dāng)使用Vector。LinkedList比較特別。LinkedList中的元素并不是通過像數(shù)組一樣的形式排列的。數(shù)組和鏈表的性能分析間的連接。如果需要查詢一個(gè)元素,需要挨個(gè)問每一個(gè)元素,“你和XXX元素連接了嗎?”可見,在查詢方面,數(shù)組形式是效率更高的。如果對(duì)集合的查詢操作較多,使用ArrayList或如果對(duì)集合的更改操作較多,使用ArrayList、LinkedList、Vector是List的常用實(shí)現(xiàn)ArrayList和Vector使用數(shù)組形式對(duì)Iterator接口中的importimportpublicclassListIteratorDemopublicstaticvoidmain(String[]{ArrayListal=newIteratori=while(i.hasNext())}}}代器獲取到元后進(jìn)行迭代,而同時(shí),你卻又對(duì)元素進(jìn)行了編輯。這樣的操作是有安提供了Iterator接口的子接口,ListIterator。ListIteratorListIterator接口只能被List以及其實(shí)現(xiàn)類擁有。這是因?yàn)長(zhǎng)ist擁有下標(biāo)ListIterator的方法可以有效List接口中獲取ListIterator接口的方ListIteratorlistIterator(); ListIteratorlistIterator(intindex); booleanadd(Object boolean int Object int void voidset(Object importpublicclassListIteratorDemopublicstaticvoidmain(String[]{ArrayListal=newListIteratorli=}}以說ListIterator更加優(yōu)越。本章Iterator沒有提供ListIterator是Iterator的子接口,其中的特有方法可以在迭代過程中對(duì)集合進(jìn)行編Set接口HashSetSet接口Set接口是集合類的重要組成部分。這個(gè)接口與List接口完全相對(duì)。List接口元素有序,可重復(fù);Set接口元素?zé)o需,不可重復(fù)。這里指的“無(wú)序”的意思是取出來的順序與存進(jìn)去的順序不一定相同。然而,這個(gè)接口作為Collection接口的子接口,沒有任何特有方法。所以說Set接口的方法這里就不說了,直接開始講實(shí)現(xiàn)類。HashSet是Set接口的經(jīng)典實(shí)現(xiàn)。同樣,這個(gè)實(shí)現(xiàn)類沒有任何特有方法,之間使用我們之前學(xué)過的Collection接口的方法使用即可。importimportpublicclassHashSetDemopublicstaticvoidmain(String[]{HashSeths=newIteratori=}}}importimportpublicclassHashSetDemopublicstaticvoidmain(String[]{HashSeths=newHashSet();Objectobj=newObject(); Iteratori=hs.iterator();}}}我們?cè)谥vadd()方法的時(shí)候,曾提到過,如果元素添加成功,返回true;沒有成功返回false。在這個(gè)程序當(dāng)中,由于我之前已經(jīng)存入了obj實(shí)例,再次存入將不會(huì)成功,因此打印add()方法的返回值將會(huì)是false。哈希表算將Object類的時(shí)候,曾經(jīng)提過Object類有一個(gè)hashCode()方法,用于返回對(duì)象的哈希碼;equals(Objectobj)用于判斷對(duì)象是否相等。常規(guī)情況下,如果兩個(gè)對(duì)象的hashCode()返回的值一樣,他們equals()也應(yīng)當(dāng)返回trueHashSetObject類中的hashCode()或equals()方法呢classMyClass1publicinthashCode()return }}classMyClass2publicbooleanequals(Objectobj)return }}class publicinthashCode()return}publicbooleanequals(Objectobj)return}}這三個(gè)類當(dāng)中:MyClass1hashCode()方法返回值是固定的;MyClass2的equals()方法的返回值是固定的;MyClass3的兩個(gè)方法的返回值都是固定的。要是把這三個(gè)類都進(jìn)HashSet會(huì)怎么樣?importpublicclassHashSetDemopublicstaticvoidmain(String[]{HashSeths=newhs.add(newMyClass1());hs.add(newMyClass1());hs.add(newMyClass2());hs.add(newMyClass2());hs.add(newMyClass3());hs.add(newMyClass3());Iteratori=hs.iterator();}}}類的toString()方法默認(rèn)返回“類名+@+哈希值”我們先觀察前面兩個(gè)MyClass1,可以發(fā)現(xiàn)“@”之后都是1,但是照樣成功MyClass2的equals()方法返回true,但是添加成功,哈希碼不一樣MyClass3的兩個(gè)方法都復(fù)寫了,添加不成功。equals()方法既返回true,hashCode()也返回可以發(fā)現(xiàn):equals()方法為true,哈希碼也一樣,才會(huì)被當(dāng)成“一個(gè)對(duì)象”在不同的位置。這樣做雖說可以,但是會(huì)降低HashSet的效率。因此一般equals()和本章HashSet是Set的實(shí)現(xiàn)類,通過哈希表算法判斷兩個(gè)對(duì)象是否相HashSet沒有特有方如果equals()方法返回true,hashCode()也一樣,會(huì)被當(dāng)做一個(gè)對(duì)TreeSet類概TreeSet也是SetHashSet最大的區(qū)別在于排序方面:HashSet類是通過哈希表對(duì)元素進(jìn)行排序的,TreeSet的排序方法是使用者自定的。今天我已有排序方法的importimportpublicclassTreeSetDemopublicstaticvoidmain(String[]{TreeSetts=newts.add(6);//添加多個(gè)Integer類Iteratori=}}}大家可以發(fā)現(xiàn),我在TreeSet中添加了幾個(gè)沒有任何順序的int(Integer)類型,但是一將Integer類(也就是int類型的包裝么如果要自定義我的類的排序方式如何實(shí)現(xiàn)呢?Comparableparable接口包含用于對(duì)對(duì)象進(jìn)行排序的方法。TreeSet中存的元素的類都必intcompareTo(Object如果返回值為負(fù)數(shù),說明this小于0,說明this與o如果返回值為正數(shù),說明this大于假如說我有一個(gè)工人類,想要通過TreeSet對(duì)工人的工號(hào)進(jìn)行排序。classprivateString privateint privateint publicStringreturn}publicWorker(Stringname,intage,intid)=name;this.age=age;this.id=id;}}toString方法,讓直接打印這個(gè)類的實(shí)例看的更加直觀。不過,由于我們這個(gè)類還沒有實(shí)現(xiàn)Comparable接口,其還不能被排序。我們讓它實(shí)現(xiàn)這的運(yùn)行時(shí)類型是不是Worker,如果是,向下轉(zhuǎn)換;如果不是,通過throw拋出id字段與thisid字段,如果this.id>obj.id,返回正數(shù)(表示this>obj)如果this.idobj.id0(表示如果this.id<obj.id,返回負(fù)數(shù)(表示classWorkerimplementsComparable{privateStringname;//privateintage;privateint publicStringreturn}publicWorker(Stringname,intage,=name;this.age=age;this.id=id;}publicintcompareTo(Objecto)if(!(oinstanceof //如果能夠執(zhí)行到這里,說明oinstanceofWorker==trueWorkerworker=(Worker)o; return elseif(this.idworker.id)//如果this的id等于worker的return }

return- }importpublicclassTreeSetDemopublicstaticvoidmain(String[]{TreeSetts=newts.add(newWorker("A",25,1));//添加Worker類對(duì)象ts.add(newWorker("B",31,5));ts.add(newts.add(newts.add(newIteratori=ts.iterator();}}}本章TreeSet是Set接口的實(shí)現(xiàn)類,通過存入對(duì)象的類的compareTo()方法對(duì)對(duì)象進(jìn)行排如果想要往TreeSet類添加對(duì)象,這個(gè)對(duì)象的類必須實(shí)現(xiàn)Comparable如果compareTo()返回正數(shù),說明this>0,this==參數(shù);如果是負(fù)Map接口接口,這是因?yàn)槠渲械臄?shù)據(jù)方式和List與Set有著很大的區(qū)別假如說我們有一個(gè)集合,這個(gè)集合是一個(gè)學(xué)生的成績(jī)單。有“80分”、“91分”目去查詢,然后再看與這個(gè)科目相對(duì)的分值。Map的特點(diǎn)就是像這樣一個(gè)元素對(duì)應(yīng)一個(gè)元素的。用于查找的元素叫做“鍵(Key)”、用于表示實(shí)際數(shù)據(jù)的元素叫做“值(Value)”Map接口有一個(gè)內(nèi)部接口,叫做Entry,也叫映射。一個(gè)EntryEntry就構(gòu)成了一個(gè)MapMap接口Map接口沒有繼承Collection,所以其中的所有方法都是特有的void booleancontainsKey(Object Set Objectget(Object boolean SetkeySet() Objectput(Objectkey,Object voidputAll(Mapm) Objectremove(Object int Collection importpublicclassMapDemopublicstaticvoidmain(String[]args)Mapmap=newHashMap();}}在這個(gè)程序中,我是實(shí)例化了HashMap之后通過put()方法加入了多個(gè)科目以及對(duì)應(yīng)分?jǐn)?shù)。之后使用size()方法返回這個(gè)Map的Entry數(shù)量。最后使用containsKey()方法判斷是Entry接口Object Object ObjectsetValue(Object importpublicclassMapDemopublicstaticvoidmain(String[]{Mapmap=newSetset=map.entrySet(); Iter

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論