《Java面向?qū)ο缶幊獭氛n件-第11章 集合_第1頁
《Java面向?qū)ο缶幊獭氛n件-第11章 集合_第2頁
《Java面向?qū)ο缶幊獭氛n件-第11章 集合_第3頁
《Java面向?qū)ο缶幊獭氛n件-第11章 集合_第4頁
《Java面向?qū)ο缶幊獭氛n件-第11章 集合_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第11章集合

學習內(nèi)容02集合概念Collection接口0103泛型01集合概念集合概念當我們遇到存儲變長的對象的時候,為此jdk給我們提供了集合類,讓我們存儲變長個數(shù)的對象與數(shù)組的比較:數(shù)組長度是固定的,集合長度是可變的。數(shù)組只可以存儲相同類型的數(shù)據(jù),集合中可以存儲任意類型的對象。集合的分類:分別是單列集合和雙列集合。單列集合稱之為Collection單列集合,雙列集合稱之為map雙列集合。Collection單列集合:單列集合根接口,用來存儲一系列符合某種規(guī)則的元素。它有兩個子接口,分別是list和setmap雙列集合:雙列集合類的根接口,用于存儲鍵值對映射關(guān)系的元素,在使用Map集合時可以根據(jù)Key鍵找到對應的Value,主要的實現(xiàn)類有HashMap和TreeMap。01集合概念集合的繼承體系下面通過一張圖來描述整個集合類的繼續(xù)體系,如下圖所示:02Collection接口Collection是所有單列集合的父接口,因此在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用于操作所有的單列集合,如下表所示。以上列舉了4類方法,分別是增加方法,說明了如何給集合添加元素,刪除方法,說明了如何刪除元素,判斷方法,說明了集合中是否包含某個元素的方法,查看方法,說明了查看元素的大小等方法。方法聲明功能描述增加方法

add(Ee)添加成功返回true,添加失敗返回false.addAll(Collectionc)把一個集合的元素添加到另外一個集合中去刪除方法

clear()移除集合所有元素remove(Objecto)移除集合一個元素removeAll(Collectionc)移除集合中的c集合retainAll(Collectionc)只保留集合中的c集合查看

size()查看集合元素的個數(shù)判斷方法

isEmpty()判斷集合元素是否為空contains(Objecto)判斷集合是否存在o對象containsAll(Collectionc)判斷集合是否存在c集合02Collection接口1、List接口Collection接口的子接口,List接口中可以有重復的元素,通過元素的equals方法,來比較是否為重復的元素,它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素,與數(shù)組的索引是一個道理,它是一個元素存取有序的集合,即元素的存入順序和取出順序是一致。不但繼承了Collection接口中的全部方法,而且還增加了一些根據(jù)元素索引來操作集合的特有方法,如下表所示:方法聲明功能描述增加方法

voidadd(intindex,Eelement)把E元素添加到集合的index處。booleanaddAll(intindex,Collectionc)把c集合中的元素添加到集合的index序號處,成功返回true,失敗返回false獲取方法

Objectget(intindex)返回集合index處的元素indexOf(Objecto)返回對象在List集合中出現(xiàn)的位置索引lastIndexOf(Objecto)返回對象在List集合中最后一次出現(xiàn)的位置索引

ListsubList(intfromIndex,inttoIndex)返回集合從fromIndex到toIndex處所有元素組成的子集合修改

set(intindex,Eelement)將索引index處元素替換成element對象,并將替換后的元素返回02Collection接口2、ArrayList集合ArrayList是List接口的一個實現(xiàn)類。實現(xiàn)原理:底層維護了一個Object[]用于存儲對象,默認數(shù)組的長度是10,當默認的或者指定的容量不夠存儲對象的時候,容量自動增長為原來的容量的1.5倍。ArrayList進行數(shù)據(jù)存儲時是通過底層數(shù)組實現(xiàn)的,數(shù)組的內(nèi)存空間地址是連續(xù)的,所以數(shù)據(jù)查找快,在增和刪的時候會牽扯到數(shù)組增容,以及數(shù)據(jù)拷貝,所以數(shù)據(jù)增加和刪除慢。

案例:publicclassDemo1{

publicstaticvoidmain(String[]args){

//創(chuàng)建集合,因為Collection為抽象類,不能直接創(chuàng)建對象,所以創(chuàng)建Collection的子類ArrayList

ArrayListc1=newArrayList();

c1.add("宋江");//add方法,添加

c1.add("武松");

ArrayListc2=newArrayList();

c2.add("武松");

c2.add("石清");

c1.addAll(c2);//把c2的元素的添加到c集合中去。

c1.remove("李逵");

System.out.println("查看元素個數(shù):"+c1.size());

System.out.println("集合的元素:"+c1);//打印出集合中所有的元素

System.out.println("第3個元素:"+c1.get(2));

c1.set(2,"魯智深");

System.out.println("修改后的第3個元素:"+c1.get(2));

c1.clear();//clear()清空集合中的元素

System.out.println("查看元素個數(shù):"+c1.size());

}}02

Collection接口3、LinkedList集合ArrayList是List接口的一個實現(xiàn)類。實現(xiàn)原理:底層采用鏈表實現(xiàn),具有增加數(shù)據(jù),刪除數(shù)據(jù)快,查詢數(shù)據(jù)慢的特點。由于LinkedList在內(nèi)存中的地址不連續(xù),需要讓上一個元素記住下一個元素,所以每個元素中保存的有下一個元素的位置,雖然也有角標,但是查找的時候,需要從頭往下找,顯然是沒有數(shù)組查找快的。但是鏈表在插入新元素的時候,只需要讓前一個元素記住新元素,讓新元素記住下一個元素就可以了,所以插入很快,鏈表在刪除元素時,只需讓前一個元素記住后一個元素,后一個元素記住前一個元素,這樣的增刪效率較高。

LinkedList集合除了具備增刪元素效率高的特點,還專門針對元素的增刪操作定義了一些特有的方法。如下表所示。方法聲明功能描述voidaddFirst(Objecto)將指定元素插人此列表的開頭voidaddLast(Objecto)將指定元素添加到此列表的結(jié)尾ObjectgetFirst()返回此列表的第一個元素ObjectgetLast()返回此列表的最后一個元素ObjectremoveFirst()移除并返回此列表的第一個元素ObjectremoveLast()移除并返回此列表的最后一個元素02

Collection接口案例:publicclassDemo2{publicstaticvoidmain(String[]args){LinkedListlst=newLinkedList();lst.add("zhansan");lst.add("lisi");lst.add(1,"wangwu");System.out.println(lst);lst.addFirst("zhouliu");System.out.println(lst);Objectfirst=lst.getFirst();System.out.println("第一個元素:"+first);Objectlast=lst.getLast();System.out.println("最后一個元素:"+last);Objectremove=lst.removeFirst();System.out.println("移除的元素第一個元素是:"+remove);System.out.println(lst);Objectremove1=lst.remove(2);System.out.println("移除的第二個元素是:"+remove1);System.out.println(lst);}}02

Collection接口4、Iterator迭代器為了方便的處理集合中的元素,jdk中出現(xiàn)了一個對象,該對象提供了一些方法專門處理集合中的元素。例如刪除和獲取集合中的元素,該對象就叫做迭代器(Iterator)。與集合的差別:list和map用于元素的存儲,而迭代器主要用于元素的處理。獲取迭代器的方法:但是該對象比較特殊,不能直接創(chuàng)建對象,該對象是以內(nèi)部類的形式存在于每個集合類的內(nèi)部。Collection接口中定義了獲取集合類迭代器的方法(iterator()方法),所有的Collection體系集合都可以獲取自身的迭代器。Collection接口通過iterator()方法可以獲得迭代器,那么滿足什么條件下的接口可以獲得迭代器呢,實現(xiàn)了Iterable接口的對象就是可迭代的,并且支持增強for循環(huán)。Iterable接口,即稱為可迭代接口,是Collection的父接口,該接口只有一個方法即獲取迭代器的方法iterator(),接下來,我們來看一下迭代器(Iterator)常用的方法,如下表所示:方法聲明功能描述booleanhasNext()如果仍有元素可以迭代,則返回true。next()返回迭代的下一個元素。remove()從迭代器指向的collection中移除迭代器返回的最后一個元素(可選操作)。02

Collection接口案例:publicclassDemo3{publicstaticvoidmain(String[]args){ArrayListlst=newArrayList();lst.add("宋江");//add方法,添加

lst.add("吳用");lst.add("武松");lst.add("武松");lst.add("李逵");lst.add("石清");Iteratoriterator=lst.iterator();//根據(jù)iterator()方法獲得自身的迭代器

while(iterator.hasNext()){//采用hasNext()方法判斷集合中是否有下一個元素,如果存在返回真,否則為假

Objectobj=iterator.next();//返回迭代的下一個元素

System.out.println(obj);}}}02

Collection接口5、Set接口Set接口和List接口一樣,同樣繼承自Collection接口,它與Collection接口中的方法基本一致,并沒有對Collection接口進行功能上的擴充,只是比Collection接口更加嚴格了。與List接口不同的是,數(shù)據(jù)存儲元素是無序的,并且都會以某種規(guī)則保證存入的元素不可重復。主要的兩個實現(xiàn)類:分別是HashSet和TreeSet。HashSet:是根據(jù)對象的哈希值來確定元素在集合中的存儲位置,因此具有良好的存取和查找性能。TreeSet:是以二叉樹的方式來存儲元素,它可以實現(xiàn)對集合中的元素進行排序。02

Collection接口6、HashSet集合hashSet是實現(xiàn)了Set接口的子類,HashSet存儲元素的順序并不是按照存入時的順序,而是按照哈希值來存的,獲取數(shù)據(jù)也是按照哈希值取得。由于Set集合是不能存入重復元素的集合。那么HashSet也是具備這一特性的,即不存入重復元素。實現(xiàn)原理:HashSet集合,采用哈希表結(jié)構(gòu)存儲數(shù)據(jù),保證元素唯一性的方式依賴于:hashCode()與equals()方法。哈希表底層使用的也是數(shù)組機制,數(shù)組中也存放對象,而這些對象往數(shù)組中存放時的位置比較特殊,當需要把這些對象給數(shù)組中存放時,那么會根據(jù)這些對象的特有數(shù)據(jù)結(jié)合相應的算法,計算出這個對象在數(shù)組中的位置,然后把這個對象存放在數(shù)組中。而這樣的數(shù)組就稱為哈希數(shù)組,即就是哈希表。當向哈希表中存放元素時,需要根據(jù)元素的特有數(shù)據(jù)結(jié)合相應的算法,這個算法其實就是Object類中的hashCode方法。由于任何對象都是Object類的子類,所以任何對象有擁有這個方法。即就是在給哈希表中存放對象時,會調(diào)用對象的hashCode方法,算出對象在表中的存放位置,這里需要注意,如果兩個對象hashCode方法算出結(jié)果一樣,這樣現(xiàn)象稱為哈希沖突,這時會調(diào)用對象的equals方法,比較這兩個對象是不是同一個對象,如果equals方法返回的是true,那么就不會把第二個對象存放在哈希表中,如果返回的是false,就會把這個值存放在哈希表中。02

Collection接口案例:publicclassDemo4{publicstaticvoidmain(String[]args){HashSethashSet=newHashSet();hashSet.add("張三");hashSet.add("李四");hashSet.add("王五");hashSet.add("張三");Iteratoriterator=hashSet.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}}從運行結(jié)果中,可以看出取出元素與添加元素的順序不一致。而且重復添加的“張三”元素被去除了,只出現(xiàn)了一次。

HashSet集合之所以能確保不出現(xiàn)重復的元素,是因為它在存入元素時做了很多工作.當調(diào)用HashSet集合的add()方法存入元素時,首先調(diào)用當前存入對象的hashCode()方法獲得對象的哈希值,然后根據(jù)對象的哈希值計算出一個存儲位置。如果該位置上沒有元素,則直接將元素存入,如果該位置上有元素存在,則會調(diào)用equals()方法讓當前存入的元素依次和該位置上的元素進行比較,如果返回的結(jié)果為false就將該元素存入集合,返回的結(jié)果為true否則說明有重復元素,就將該元素舍棄。02

Collection接口7、TreeSet集合TreeSet是Set接口的另一個實現(xiàn)類,它內(nèi)部采用自平衡的排序二叉樹來存儲元素,這樣的結(jié)構(gòu)可以保證TreeSet集合中沒有重復的元素,并且可以對元素進行排序。二叉樹原理:所謂二叉樹就是說每個節(jié)點最多有兩個子節(jié)點的有序樹,每個節(jié)點及其子節(jié)點組成的樹稱為子樹,通常左側(cè)的子節(jié)點稱為“左子樹”,右側(cè)的子節(jié)點稱為“右子樹”。之后存入的元素與第一個元素比較,如果小于第一個元素就將該元素放在左子樹上,如果大于第1個元素,就將該元素放在右子樹上,案例如下:publicclassDemo5{publicstaticvoidmain(String[]args){TreeSettreeSet=newTreeSet();treeSet.add(18);treeSet.add(23);treeSet.add(10);treeSet.add(15);treeSet.add(25);treeSet.add(19);Iteratoriterator=treeSet.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}}03

泛型1、泛型集合如果想讓集合和數(shù)組一樣,在集合中只能存放一種數(shù)據(jù)類型對象,為了解決這個問題,在Java中引人了“參數(shù)化類型(parameterizedtype)”這個概念,即泛型。它可以限定集合操作的數(shù)據(jù)類型,在定義集合類時,使用“<參數(shù)化類型>”的方式指定該類中方法操作的數(shù)據(jù)類型,具體格式如下:集合類<數(shù)據(jù)類型>變量=new集合類<數(shù)據(jù)類型>();ArrayList<String>arrayList=newArrayList<String>();案例:publicclassDemo6{publicstaticvoidmain(String[]args){//1.創(chuàng)建一個泛型集合,確定集合中只能存儲字符串數(shù)據(jù)類型的對象

ArrayList<String>lst=newArrayList<String>();lst.add("宋江");//只能添加字符串類型的數(shù)據(jù),否則會出現(xiàn)編譯錯誤

lst.add("吳用");lst.add("武松");lst.add("武松");lst.add("李逵");lst.add("石清");//產(chǎn)生一個泛型的迭代器

Iterator<String>iterator=lst.iterator();while(iterator.hasNext()){Stringitem=iterator.next();//直接取出一個字符串類型的元素

System.out.println(item);}}}03

泛型2、自定義泛型自定義泛型就是一個數(shù)據(jù)類型的占位符或者說是一個數(shù)據(jù)類型的變量。自定義泛型聲明方法:自定義泛型通常采用<T>聲明參數(shù)類型,T其實就是Type的縮寫,這里也可以使用其他字符.為了方便理解都定義為T。如果我們采用自定義泛型,定義泛型方法的形式是:

<T>T方法名(Tt)其中<T>:用于聲明T是一個數(shù)據(jù)類型自定義泛型使用場合:因為在程序設計過程中,經(jīng)常遇到一些特殊要求,所以經(jīng)常運用自定義泛型技術(shù),比如自定義泛型會運用到泛型方法、泛型類和泛型接口等場合。03

泛型3、泛型類那么在類中使用了自定義泛型的類,就是泛型類。泛型類的格式:定義格式:修飾符class類名<代表泛型的變量>{…….}使用格式:創(chuàng)建對象時,確定泛型的類型案例:classPoint<T>{//此處可以隨便寫標識符號

privateTx;privateTy;publicvoidsetX(Tx){//作為參數(shù)

this.x=x;}publicvoidsetY(Ty){this.y=y;}publicTgetX(){//作為返回值

returnthis.x;}publicTgetY(){returnthis.y;}}publicclassDemo7{publicstaticvoidmain(String[]args){//2.使用泛型類創(chuàng)建對象時,泛型類中的占位符T必須要用真實的數(shù)據(jù)類型代替。

Point<Integer>p1=newPoint<Integer>();p1.setX(10);p1.setY(20);System.out.println("整數(shù)點X坐標是:"+p1.getX()+"整數(shù)點Y坐標是:"+p1.getY());Point<Float>p2=newPoint<Float>();p2.setX(10.1f);p2.setY(20.2f);System.out.println("浮點數(shù)點X坐標是:"+p1.getX()+"浮點數(shù)點Y坐標是:"+p1.getY());}}03

泛型4、泛型接口使用了自定義泛型的接口就是泛型接口.泛型接口的格式:定義格式:修飾符interface接口名<代表泛型的變量>{…….}使用格式:創(chuàng)建對象時,確定泛型的類型案例:interfaceTools<T>{voidprint(Tt1,Tt2);}classMyTools<T>implementsTools<T>{@Overridepublicvoidprint(Tt1,Tt2){System.out.println(t1.toString());System.out.println(t2.toString());}}classInfo{Stringname;Stringdesp;publicInfo(Stringname,Stringdesp){=name;this.desp=desp;}@OverridepublicStringtoString(){return"Info{"+"name='"+name+'\''+",desp='"+desp+'\''+'}';}}publicclassDemo7_2{publicstaticvoidmain(String[]args){MyTools<Info>myTools=newMyTools<Info>();myTools.print(newInfo("清華大學","中國排名前2名"),newInfo("北京大學","中國排名前2名"));}}03

泛型注意:泛型接口定義之后,必須要創(chuàng)建實現(xiàn)了接口的類,才能創(chuàng)建對象。創(chuàng)建實現(xiàn)了接口的類,有2種實現(xiàn)方法,本例中采用一種實現(xiàn)泛型接口的方式,還有另外一種實現(xiàn)泛型接口的方式,代碼如下:classMyTools2implementsTools<String>{@Overridepublicvoidprint(Stringt1,Stringt2){}}第二種方式與第一種方式比較:第一種方式依舊采用了占位符的實現(xiàn)類,第二種采用了確定的數(shù)據(jù)類型的實現(xiàn)類。那么在實際應用中,根據(jù)具體情況靈活采用不同的實現(xiàn)方式。03

泛型5、

泛型方法:使用了自定義泛型的方法就是泛型方法。泛型方法格式:定義格式:修飾符<代表泛型的變量>返回值類型方法名(參數(shù)){}使用格式:調(diào)用方法時,確定泛型的類型案例:classDog{Stringname;intage;publicDog(Stringname,intage){=name;this.age=age;}@OverridepublicStringtoString(){return"Dog{"+"name='"+name+'\''+",age="+age+'}';}}classCat{Stringname;intage;publicCat(Stringname,intage){=name;this.age=age;}@OverridepublicStringtoString(){return"Cat{"+"name='"+name+'\''+",age="+age+'}';}}03

泛型案例繼續(xù):publicclassDemo8{publicstaticvoidmain(String[]args){ArrayList<Dog>lst1=newArrayList<Dog>();ArrayList<Cat>lst2=newArrayList<Cat>();add(lst1,newDog("小狗",2));add(lst1,newDog("小黃狗",3));add(lst2,newCat("小貓",1));add(lst2,newCat("小黑貓",1));print(lst1);print(lst2);}publicstatic<T>voidadd(ArrayList<T>lst,Tt){lst.add(t);}publicstatic<T>voidprint(ArrayList<T>lst){System.out.println(lst);}}

05

泛型泛型上下限如果現(xiàn)在我們需要對數(shù)據(jù)類型進行限制,比如只有Interger及其父類的數(shù)據(jù)類型可以接受,

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論