版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、3.1、認(rèn)識(shí)(rn shi)類集(理解)如果現(xiàn)在要想保存多個(gè)對象,肯定使用對象數(shù)組完成,但是對象數(shù)組本身有一個(gè)最大的問題在于其數(shù)據(jù)的長度,所以后來使用了鏈表完成了動(dòng)態(tài)對象數(shù)組的開發(fā)(kif),可是鏈表的開發(fā)難度實(shí)在是很大,而且如果一個(gè)鏈表要想真正去使用,只依靠之前所編寫的還不夠,還需要進(jìn)行一些代碼的調(diào)優(yōu)。而在JDK 1.2之后正式引入了類集的概念,類集是一種動(dòng)態(tài)的對象數(shù)組,屬于各個(gè)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)(shxin)類,在整個(gè)類集之中主要的組成是一些核心的操作接口:Collection、List、Set、Map、Iterator、Enumeration。3.2、單值保存的最大父接口:Collectio
2、n(重點(diǎn))所謂的單值保存指的是每一次操作只會(huì)保存一個(gè)對象,就好像之前的鏈表程序一樣,每一次只保存了一個(gè)對象,在Collection接口之中定義了如下的一些操作方法。No.方法名稱類型描述1public boolean add(E e)普通數(shù)據(jù)增加2public void clear()普通清除數(shù)據(jù)3public boolean contains(Object o)普通查找數(shù)據(jù)是否存在4public boolean isEmpty()普通判斷是否為空集合5public Iterator iterator()普通為Iterator接口實(shí)例化6public boolean remove(Object
3、 o)普通刪除數(shù)據(jù)7public int size()普通取得集合的個(gè)數(shù)8public Object toArray()普通將集合變?yōu)閷ο髷?shù)組在Collection接口之中一共定義了15個(gè)方法,在所有的方法之中,只有兩個(gè)方法最為常用:add()、iterator()。不過從開發(fā)上講,很少會(huì)去直接使用Collection,都會(huì)使用Collection的兩個(gè)子接口:List、Set。3.3、允許重復(fù)的子接口:List(重點(diǎn),80%)List是Collection的一個(gè)最為常用的子接口,首先這個(gè)接口的定義如下:public interface List extends Collection但是Lis
4、t接口對Collection接口進(jìn)行了大量的擴(kuò)充,但是擴(kuò)充之后的主要方法:No.方法名稱類型描述1public E get(int index)普通取得指定索引位置上的數(shù)據(jù)2public E set(int index, E element)普通修改指定索引位置上的數(shù)據(jù)3public ListIterator listIterator()普通為ListIterator接口實(shí)例化但是以上的三個(gè)方法,只是針對于List接口起作用,而List接口有兩個(gè)常用子類:ArrayList、Vector。3.3.1、新的子類:ArrayList,95%ArrayList是List子接口使用最多的一個(gè)子類,而這
5、個(gè)類的定義如下:public class ArrayListextends AbstractListimplementsList, RandomAccess, Cloneable, Serializable按照(nzho)面向?qū)ο蟮母拍顏碇v,現(xiàn)在使用ArrayList主要(zhyo)的目的是為List接口(ji ku)實(shí)例化,所有的操作方法都以List接口為主。范例:使用ArrayList進(jìn)行List接口的功能驗(yàn)證packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.List;publicclassTestDemo publ
6、icstaticvoidmain(String args)throwsException List all =newArrayList() ;all.add(Hello) ;all.add(Hello) ;/內(nèi)容重復(fù)了all.add(World) ;for(intx = 0; x all.size(); x+) String str = all.get(x) ;/ get()方法只有List接口有System.out.print(str +、);在使用代碼的時(shí)候可以發(fā)現(xiàn),List集合之中即使存在了重復(fù)數(shù)據(jù),也可以正常的保存,而且數(shù)據(jù)保存的順序就是存入數(shù)據(jù)的順序。范例:使用List集合修改之前的
7、程序packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.List;interfaceAnimal /動(dòng)物publicString getName() ;publicintgetAge() ;classZoo privateListanimals=newArrayList() ;/多個(gè)動(dòng)物publicvoidadd(Animal ani) /增加動(dòng)物this.animals.add(ani) ;/增加動(dòng)物publicvoiddelete(Animal ani) this.animals.remove(ani) ;/需要equ
8、als()publicList search(String keyWord) List result =newArrayList() ;for(intx = 0 ; x this.animals.size() ; x +) Animal ani =this.animals.get(x) ;if(ani.getName().contains(keyWord) /滿足result.add(ani) ;returnresult ;classDogimplementsAnimal privateStringname;privateintage;publicDog(String name,intage)
9、 = name ;this.age= age ;publicString getName() return;publicintgetAge() returnthis.age;publicbooleanequals(Object obj) if(this= obj) returntrue;if(obj =null) returnfalse;if(!(objinstanceofDog) returnfalse;Dog dog = (Dog) obj ;if(.equals()&this.age= dog.age) returntrue;returnfalse;publicString toStri
10、ng() return狗的信息名字:+,年齡:+this.age;classTigerimplementsAnimal privateStringname;privateintage;publicTiger(String name,intage) = name ;this.age= age ;publicString getName() return;publicintgetAge() returnthis.age;publicbooleanequals(Object obj) if(this= obj) returntrue;if(obj =null) returnfalse;if(!(ob
11、jinstanceofTiger) returnfalse;Tiger t = (Tiger) obj ;if(.equals()&this.age= t.age) returntrue;returnfalse;publicString toString() return老虎的信息名字:+,年齡:+this.age;publicclassTestDemo publicstaticvoidmain(String args) Zoo zoo =newZoo() ;/動(dòng)物園zoo.add(newDog(花狗,1) ;zoo.add(newDog(黃狗,1) ;zoo.add(newDog(黑狗,1)
12、 ;zoo.add(newDog(斑點(diǎn)狗,1) ;zoo.add(newTiger(斑點(diǎn)虎,2) ;zoo.add(newTiger(黑虎,2) ;zoo.add(newTiger(花虎,2) ;zoo.delete(newDog(斑點(diǎn)狗,1) ;/刪除List result = zoo.search(斑點(diǎn)) ;for(intx = 0 ; x result.size() ; x +) System.out.println(result.get(x) ;至少此時(shí)(c sh)的程序不再需要自己去開發(fā)鏈表了,所有的鏈表的實(shí)現(xiàn)(shxin)類都有了。3.3.2、舊的子類:Vector,5%Vecto
13、r類是在JDK 1.0的時(shí)候就推出的一個(gè)(y )最早的實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的操作類,實(shí)際上對于今天而言,有許多的類上依然還是在使用著Vector,不過從實(shí)際的開發(fā)來講,現(xiàn)在設(shè)計(jì)的一些程序都是針對于接口的操作了。packagecn.mldn.demo;importjava.util.List;importjava.util.Vector;publicclassTestDemo publicstaticvoidmain(String args)throwsException List all =newVector() ;all.add(Hello) ;all.add(Hello) ;/內(nèi)容重復(fù)了all.a
14、dd(World) ;for(intx = 0; x all.size(); x+) String str = all.get(x) ;/ get()方法只有List接口有System.out.print(str +、);因?yàn)樗械牟僮鞫际轻槍τ诮涌谕瓿傻?,接口定義的方法不變,子類隨便變。面試題:請解釋ArrayList和Vector的區(qū)別?No.區(qū)別ArrayListVector1推出時(shí)間JDK 1.2JDK 1.02性能采用異步處理方式,性能更高采用同步處理方式,性能相對較低3安全性非線程安全線程安全4輸出Iterator、ListIterator、foreachIterator、List
15、Iterator、foreach、Enumeration從實(shí)際開發(fā)而言,幾乎都是開發(fā)異步程序,所以首選的肯定是ArrayList子類。3.4、不允許重復(fù)的子接口:Set(重點(diǎn)),20%Set也是一個(gè)Collection較為常用的子接口,這個(gè)接口的定義如下:public interface Set extends Collection在Collection接口定義了15個(gè)方法,但是Set子接口并不像List子接口那樣對Collection接口進(jìn)行了大量的擴(kuò)充,而是完整的繼承了下來,那么就證明了在Set子接口之中是肯定無法使用get()方法的。那么在Set子接口之中常用的兩個(gè)子類:HashSet、
16、TreeSet,下面分別說明。3.4.1、散列存放的子類:HashSet,80%Hash(哈希)屬于一種算法,這種算法的核心意義指的是找空保存算法,所以只要一看見hash第一反應(yīng)就是說沒有順序的保存。范例:觀察Set接口使用packagecn.mldn.demo;importjava.util.HashSet;importjava.util.Set;publicclassTestDemo publicstaticvoidmain(String args)throwsException Set all =newHashSet() ;all.add(Hello) ;all.add(Hello) ;
17、/內(nèi)容重復(fù)了all.add(World) ;System.out.println(all);保存數(shù)據(jù)再輸出(shch)之后可以發(fā)現(xiàn),重復(fù)的數(shù)據(jù)沒有了,并且其本身的保存也是沒有任何順序的。3.4.2、排序(pi x)存放的子類:TreeSet,20%如果現(xiàn)在(xinzi)希望Set集合之中保存的數(shù)據(jù)有順序,那么就通過TreeSet進(jìn)行Set接口的實(shí)例化。范例:使用TreeSetpackagecn.mldn.demo;importjava.util.Set;importjava.util.TreeSet;publicclassTestDemo publicstaticvoidmain(String
18、 args)throwsException Set all =newTreeSet() ;all.add(D) ;all.add(A) ;/內(nèi)容重復(fù)了all.add(B) ;all.add(B) ;all.add(C) ;System.out.println(all);現(xiàn)在發(fā)現(xiàn)所有保存的數(shù)據(jù)沒有重復(fù)且有序排列。3.4.3、關(guān)于TreeSet排序的說明(重點(diǎn))通過之前的程序可以發(fā)現(xiàn),使用TreeSet實(shí)例化Set接口之中,所有保存的數(shù)據(jù)都是有序的,那么在這種情況下,那么如果說使用的是一個(gè)自定義的類呢?那么這個(gè)時(shí)候如果這個(gè)類對象要進(jìn)行排序的話,則這個(gè)類必須實(shí)現(xiàn)Comparable接口,設(shè)置比較規(guī)則
19、。但是在這種情況下有一點(diǎn)必須注意:一旦使用了Comparable之后,類之中的所有屬性都必須寫進(jìn)排序規(guī)則。范例:自定義類排序packagecn.mldn.demo;importjava.util.Set;importjava.util.TreeSet;classPersonimplementsComparable privateStringname;privateintage;publicPerson(String name,intage) = name ;this.age= age ;OverridepublicString toString() return姓名:+,年齡:+this.ag
20、e+n;OverridepublicintcompareTo(Person o) if(this.age o.age) return1 ;elseif(this.age o.age) return-1 ;elsereturnpareTo();publicclassTestDemo publicstaticvoidmain(String args)throwsException Set all =newTreeSet() ;all.add(newPerson(張三,20) ;all.add(newPerson(張三,20) ;/全部重復(fù)all.add(newPerson(李四,20) ;/年齡重
21、復(fù)all.add(newPerson(王五,19) ;all.add(newPerson(趙六,21) ;System.out.println(all);TreeSet子類依靠(yko)Comparable中compareTo()方法(fngf)的返回值是否為0來判斷是否為重復(fù)(chngf)元素。3.4.4、關(guān)于重復(fù)元素的說明那么TreeSet依靠Comparable進(jìn)行重復(fù)元素判斷,那么HashSet可以嗎?發(fā)現(xiàn)以上的程序換為了HashSet之后,該有的重復(fù)還是有,因?yàn)閺恼嬲囊饬x上來講,判斷重復(fù)元素依靠的不是Comparable(只有排序的時(shí)候才依靠Comparable),所有的重復(fù)元素的
22、判斷依靠于Object類的兩個(gè)方法:hash碼:public int hashCode();對象比較:public boolean equals(Object obj)。在進(jìn)行對象比較的過程之中,首先會(huì)先使用hashCode()與已保存在集合之中的對象的hashCode()進(jìn)行比較,如果代碼相同,則再使用equals()方法進(jìn)行屬性的依次判斷,如果全部相同,則為相同元素。那么為了保證每一個(gè)對象的hashCode()不一樣,需要設(shè)計(jì)一組數(shù)學(xué)公式才可以,會(huì)嗎?范例:重復(fù)元素packagecn.mldn.demo;importjava.util.HashSet;importjava.util.Set
23、;classPerson privateStringname;privateintage;publicPerson(String name,intage) = name ;this.age= age ;OverridepublicString toString() return姓名:+,年齡:+this.age+n;OverridepublicinthashCode() finalintprime = 31;intresult = 1;result = prime * result +age;result = prime * result + (name=null) ? 0 :name.has
24、hCode();returnresult;Overridepublicbooleanequals(Object obj) if(this= obj)returntrue;if(obj =null)returnfalse;if(getClass() != obj.getClass()returnfalse;Person other = (Person) obj;if(age!= other.age)returnfalse;if(name=null) if(!=null)returnfalse;elseif(!name.equals()returnfalse;returntrue;publiccl
25、assTestDemo publicstaticvoidmain(String args)throwsException Set all =newHashSet() ;all.add(newPerson(張三,20) ;all.add(newPerson(張三,20) ;/全部重復(fù)all.add(newPerson(李四,20) ;/年齡重復(fù)all.add(newPerson(王五,19) ;all.add(newPerson(趙六,21) ;System.out.println(all);至此(zhc),Object類之中的全部方法(fngf)就講解完成了。3.5、集合(jh)的輸出操作(重
26、點(diǎn))在之前所介紹的都屬于單值集合的基本操作,可是對于集合有一個(gè)最為重要的問題就是如何進(jìn)行集合內(nèi)容的輸出操作,而這個(gè)問題在Java的類集框架之中給出了四種輸出方式:Iterator、ListIterator、Enumeration、foreach。3.5.1、迭代輸出:Iterator(核心),95%Iterator是最為常用的集合輸出接口,在這個(gè)接口中一共定義了三個(gè)方法,但只有兩個(gè)有真正用處:判斷(pndun)是否有下一個(gè)元素:public boolean hasNext();取得下一個(gè)(y )元素:public E next()。在Iterator接口之中存在(cnzi)了一個(gè)remove(
27、)方法,但是這個(gè)方法真沒用。而且在之前學(xué)習(xí)的Scanner也是Iterator的子類。但是如何取得Iterator接口的實(shí)例化對象呢?這一操作在Collection接口就已經(jīng)明確定義了,因?yàn)镃ollection繼承了一個(gè)Iterable接口,在這個(gè)接口下定義了一個(gè)方法:public Iterator iterator(),取得Iterator接口的實(shí)例化對象,但是與之前在IO操作部分學(xué)習(xí)的一樣,OutputStream實(shí)現(xiàn)了Closeable和Flushable兩個(gè)接口,但是這兩個(gè)接口屬于新的接口,和這兩個(gè)接口一樣,Iterable接口也是在JDK 1.5的時(shí)候出現(xiàn)的,那么基本上也不會(huì)去關(guān)心這
28、兩個(gè)接口,因?yàn)镃ollection接口中也已經(jīng)明確定義了iterator()方法。范例:使用Iterator輸出集合數(shù)據(jù)packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publicclassTestDemo publicstaticvoidmain(String args)throwsException List all =newArrayList();all.add(Hello);all.add(Hello);/內(nèi)容重復(fù)了all.add(World);Ite
29、rator iter = all.iterator();while(iter.hasNext() /判斷是否有下一個(gè)元素String str = iter.next() ;System.out.print(str +、);以后只要是見到了集合的輸出操作,永遠(yuǎn)都使用Iterator接口完成。3.5.2、雙向迭代輸出:ListIterator(了解),0.09%Iterator可以完成的是由前向后的單向輸出操作,如果現(xiàn)在希望可以完成由前向后,和由后向前輸出的話,那么就可以利用ListIterator接口完成,此接口是Iterator的子接口,在ListIterator接口主要使用以下兩個(gè)擴(kuò)充方法:
30、判斷是否有前一個(gè)元素:public boolean hasPrevious();取出前一個(gè)元素:public E previous()。但是如果要想取得ListIterator接口的實(shí)例化對象,Collection沒有這樣的方法支持,這個(gè)方法在List接口之中存在:public ListIterator listIterator()。范例:執(zhí)行雙向迭代packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.List;importjava.util.ListIterator;publicclassTestDemo publics
31、taticvoidmain(String args)throwsException List all =newArrayList();all.add(Hello);all.add(Hello);/內(nèi)容重復(fù)了all.add(World);ListIterator iter = all.listIterator();System.out.print(由前向后輸出:);while(iter.hasNext() /判斷是否有下一個(gè)元素String str = iter.next() ;System.out.print(str +、);System.out.print(n由后向前輸出:);while(i
32、ter.hasPrevious() String str = iter.previous() ;System.out.print(str +、);但是對于由后向前的輸出(shch)操作,在進(jìn)行之前一定要首先發(fā)生由前向后的輸出。由于此輸出接口只有List可以使用,所以在開發(fā)(kif)之中幾乎不會(huì)出現(xiàn)。3.5.3、廢棄(fiq)的接口:Enumeration(重點(diǎn)),4.9%Enumeration是一個(gè)最早的輸出接口,最早稱為枚舉輸出,在JDK 1.0的時(shí)候就已經(jīng)推出了,并且在JDK 1.5的時(shí)候?qū)⑵涔δ苓M(jìn)行了擴(kuò)充,主要就是增加了泛型,在Enumeration接口里面只定義了兩個(gè)方法:判斷是否有下
33、一個(gè)元素:public boolean hasMoreElements();取得當(dāng)前元素:public E nextElement();不過要想取得Enumeration的實(shí)例化對象,不能依靠Collection接口了,只能夠依靠Vector類完成,在Vector子類之中定義了如下一個(gè)方法:publicEnumerationelements()。范例:使用Enumeration進(jìn)行輸出packagecn.mldn.demo;importjava.util.Enumeration;importjava.util.Vector;publicclassTestDemo publicstaticvoi
34、dmain(String args)throwsException Vector all =newVector();all.add(Hello);all.add(Hello);/內(nèi)容重復(fù)了all.add(World);Enumeration enu = all.elements();while(enu.hasMoreElements() String str = enu.nextElement();System.out.print(str +、);從開發(fā)而言,首先考慮絕對不是Enumeration,考慮的肯定是Iterator,只有在必須使用的時(shí)候才用它。3.5.4、JDK 1.5的支持:fo
35、reach(理解),0.01%對于foreach輸出除了可以進(jìn)行數(shù)組內(nèi)容的輸出之外,也可以針對于集合完成輸出。范例:使用foreachpackagecn.mldn.demo;importjava.util.ArrayList;importjava.util.List;publicclassTestDemo publicstaticvoidmain(String args)throwsException List all =newArrayList();all.add(Hello);all.add(Hello);/內(nèi)容重復(fù)了all.add(World);for(String str : all)
36、 System.out.print(str +、);使用(shyng)foreach并不是一個(gè)被廣泛認(rèn)可的操作代碼(di m)形式。3.6、偶對象(duxing)保存:Map接口(重點(diǎn))偶對象指的是一對對象,即:兩個(gè)對象要同時(shí)保存。這兩個(gè)對象是按照了“key =value”的形式進(jìn)行定義的,即:可以通過key找到對應(yīng)的value數(shù)據(jù),就好象電話號碼本一樣,例如,電話號碼本之中保存了如下的信息:key =張三,value = 123456;key =李四,value = 234567;現(xiàn)在如果要想找到張三的電話,那么肯定根據(jù)張三的key,取得對應(yīng)的value,而如果現(xiàn)在要想找王五的電話,由于沒有
37、王五這個(gè)key,所以返回的結(jié)果就是null。Map就是實(shí)現(xiàn)這樣一種操作的數(shù)據(jù)結(jié)構(gòu),這個(gè)接口之中定義的主要操作方法如下。No.方法名稱類型描述1public V put(K key, V value)普通向集合之中保存數(shù)據(jù)2public V get(Object key)普通通過指定的key取得對應(yīng)的value3public Set keySet()普通將Map中的所有key以Set集合的方式返回4public SetMap.Entry entrySet()普通將Map集合變?yōu)镾et集合在Map接口之中有兩個(gè)常用的子類:HashMap、Hashtable。3.6.1、新的子類:HashMap,9
38、5%HashMap是Map接口之中使用最多的一個(gè)子類,這個(gè)子類的定義如下:public class HashMapextends AbstractMapimplementsMap, Cloneable, Serializable下面就直接通過HashMap演示Map接口中各個(gè)主要方法的作用。范例:驗(yàn)證Map方法packagecn.mldn.demo;importjava.util.HashMap;importjava.util.Map;publicclassTestDemo publicstaticvoidmain(String args)throwsException Map map =ne
39、wHashMap();map.put(3,張三);map.put(null,無名氏);map.put(3,李四);/ key重復(fù),value會(huì)被新內(nèi)容覆蓋map.put(1,王五);map.put(0,趙六);System.out.println(map.get(3);System.out.println(map.get(null);通過這一代碼可以發(fā)現(xiàn),Map和Collection在操作上的不同:Collection接口設(shè)置完的內(nèi)容目的是為了輸出;Map接口(ji ku)設(shè)置完內(nèi)容(nirng)的目的是為了(wi le)查找。范例:取得全部的key,全部的key通過Set集合返回packag
40、ecn.mldn.demo;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;publicclassTestDemo publicstaticvoidmain(String args)throwsException Map map =newHashMap();map.put(3,張三);map.put(null,無名氏);map.put(3,李四);/ key重復(fù),value會(huì)被新內(nèi)容覆蓋map.put(1,王五);map.put(0,趙六);Set set = ma
41、p.keySet() ;/取得全部的keyIterator iter = set.iterator() ;while(iter.hasNext() Integer key = iter.next() ;System.out.println(key + - + map.get(key);3.6.2、舊的子類:Hashtable,5%Hashtable是在JDK 1.0的時(shí)候推出的一個(gè)數(shù)據(jù)結(jié)構(gòu)類,在JDK 1.2之后,讓Hashtable實(shí)現(xiàn)了一個(gè)Map接口,所以用戶在使用的時(shí)候依然采用子類為接口實(shí)例化的方法進(jìn)行,那么只要接口的方法不變,實(shí)際上不管使用那一個(gè)子類都一樣。packagecn.mldn
42、.demo;importjava.util.Hashtable;importjava.util.Map;publicclassTestDemo publicstaticvoidmain(String args)throwsException Map map =newHashtable();map.put(3,張三);map.put(3,李四);/ key重復(fù),value會(huì)被新內(nèi)容覆蓋map.put(1,王五);map.put(0,趙六);System.out.println(map.get(3);System.out.println(map.get(10);這個(gè)時(shí)候在使用Hashtable子類
43、的時(shí)候,里面的數(shù)據(jù)不能有null。面試題:請解釋HashMap和Hashtable的區(qū)別?No.區(qū)別HashMapHashtable1推出時(shí)間JDK 1.2JDK 1.02性能采用異步處理方式,性能更高采用同步處理方式,性能相對較低3安全性非線程安全線程安全4設(shè)置null允許將key或value設(shè)置為null不允許出現(xiàn)null,否則出現(xiàn)空指向異常3.6.3、關(guān)于Map集合的輸出問題(核心)對于集合操作,在之前就一直(yzh)強(qiáng)調(diào):只要是集合的輸出都使用Iterator完成,但是對于(duy)現(xiàn)在的Map集合(jh)就麻煩了,因?yàn)镸ap接口之中并沒有提供像Collection接口那樣的itera
44、tor()方法,所以如何使用Iterator輸出Map集合呢?如果要想真正的去思考Map接口通過Iterator輸出,那么首先需要來觀察一個(gè)Map.Entry接口,此接口定義如下:publicstaticinterface Map.Entry很明顯,這是一個(gè)在Map接口之中使用static定義的一個(gè)內(nèi)部接口。而且通過Map接口的定義也可以發(fā)現(xiàn)此內(nèi)部接口的存在。而在Map.Entry這個(gè)內(nèi)部接口之中還存在有以下的兩個(gè)常用方法:取得當(dāng)前的key:public K getKey();取得當(dāng)前的value:public V getValue()。下面通過一個(gè)圖形來對比一下Collection和Map接
45、口保存的數(shù)據(jù)形式。通過以上的對比可以發(fā)現(xiàn),在Map集合和Collection集合之中保存的最大區(qū)別:Collection直接保存的是要操作對象,而Map集合是將保存的key和value變成了一個(gè)Map.Entry對象,通過這個(gè)對象包裝了key和value后保存的,所以根據(jù)這一特征,就可以給出Map使用Iterator輸出的操作步驟:使用Map接口中的entrySet()方法,將Map集合變?yōu)镾et集合;取得(qd)了Set接口實(shí)例之后就可以(ky)利用iterator()方法(fngf)取得Iterator的實(shí)例化對象;使用Iterator迭代找到每一個(gè)Map.Entry對象,并進(jìn)行key和v
46、alue的分離。范例:使用Iterator輸出Map集合packagecn.mldn.demo;importjava.util.Hashtable;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;publicclassTestDemo publicstaticvoidmain(String args)throwsException Map map =newHashtable();map.put(3,張三);map.put(3,李四);/ key重復(fù),value會(huì)被新內(nèi)容覆蓋map.put(1,王五);map.pu
47、t(0,趙六);SetMap.Entry set = map.entrySet();IteratorMap.Entry iter = set.iterator();while(iter.hasNext() Map.Entry me = iter.next();System.out.println(me.getKey() +,+ me.getValue();這種代碼在日后的所有開發(fā)之中一定會(huì)出現(xiàn),所以必須會(huì)。面試題:現(xiàn)在在一個(gè)List集合之中保存了多個(gè)String對象,要求將這個(gè)List集合變?yōu)镾et集合,而后再將這個(gè)Set集合之中的全部數(shù)據(jù)保存在Map集合的value里面,而Map集合的key
48、使用UUID生成,最后將Map中的數(shù)據(jù)進(jìn)行迭代輸出。相關(guān)說明:1、在Collection接口之中存在一個(gè)增加一組集合的方法:publicboolean addAll(Collection c);2、UUID是一種算法,在Java中有指定的類,這個(gè)類可以根據(jù)時(shí)間戳生成一個(gè)幾乎不會(huì)重復(fù)的字符串;packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.HashSet;importjava.util.Iterator;importjava.util.List;importjava.uti
49、l.Map;importjava.util.Set;importjava.util.UUID;publicclassTestDemo publicstaticvoidmain(String args)throwsException List list =newArrayList();list.add(Hello);list.add(Hello);list.add(World);Set set =newHashSet();set.addAll(list);/將List集合加到Set之中Map map =newHashMap();Iterator iter = set.iterator();whi
50、le(iter.hasNext() map.put(UUID.randomUUID(), iter.next();/數(shù)據(jù)保存到Map集合IteratorMap.Entry iterMap = map.entrySet().iterator();while(iterMap.hasNext() Map.Entry me = iterMap.next();System.out.println(me.getKey() + - + me.getValue();就是把幾個(gè)集合互相折騰(zh tng)了一番。3.6.4、關(guān)于(guny)Map中保存(bocn)key的說明通過程序可以發(fā)現(xiàn),之前的Map集合之
51、中都是使用了系統(tǒng)類作為了Map的key,那么實(shí)際上用戶也可以使用自定義的類作為key出現(xiàn),可是如果要想作為key的類必須注意一點(diǎn):因?yàn)閗ey屬于查找操作,所以要想找到符合的key,那么作為key所在的類就必須覆寫Object類之中的兩個(gè)方法:hashCode()、equals()。范例:自定義類作為keypackagecn.mldn.demo;importjava.util.HashMap;importjava.util.Map;classPerson privateStringname;publicPerson(String name) = name;OverridepublicString
52、 toString() return姓名:+;OverridepublicinthashCode() finalintprime = 31;intresult = 1;result = prime * result + (name=null) ? 0 :name.hashCode();returnresult;Overridepublicbooleanequals(Object obj) if(this= obj)returntrue;if(obj =null)returnfalse;if(getClass() != obj.getClass()returnfalse;Person other
53、 = (Person) obj;if(name=null) if(!=null)returnfalse;elseif(!name.equals()returnfalse;returntrue;publicclassTestDemo publicstaticvoidmain(String args)throwsException Map map =newHashMap();map.put(newPerson(張三),newString(zs);System.out.println(map.get(newPerson(張三);但是這種程序也只是作為學(xué)習(xí)之中的概念出現(xiàn),而在實(shí)際的開發(fā)之中,永遠(yuǎn)都是S
54、tring作為key,因?yàn)樽罘奖恪?.7、Stack類(理解)Stack是棧,棧是一種(y zhn)先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),Stack類的定義(dngy)如下:public class Stack extends Vector可以(ky)發(fā)現(xiàn)Stack類屬于Vector的子類,但是使用的時(shí)候卻不使用Vector類定義的方法,而使用Stack類自己的方法:入棧操作:public E push(E item);出棧操作:public E pop();范例:觀察棧的基本操作packagecn.mldn.demo;importjava.util.Stack;publicclassTestDemo publ
55、icstaticvoidmain(String args)throwsException Stack all =newStack();all.add(A);all.add(B);all.add(C);System.out.println(all.pop();System.out.println(all.pop();System.out.println(all.pop();System.out.println(all.pop();/沒數(shù)據(jù)了,出現(xiàn)EmptyStackException對于棧這一概念在自己編寫的代碼之中使用不多,不過以后的學(xué)習(xí)都會(huì)出現(xiàn)棧的概念,例如:在Android開發(fā)之中,多個(gè)A
56、ctivity之間的互相調(diào)用和返回就是利用了棧。3.8、Collections類(了解)Collections是專門提供的一個(gè)集合的工具類,并沒有實(shí)現(xiàn)Collection接口,但是在這個(gè)類之中,有許多的操作方法,可以方便的進(jìn)行集合的操作(根本沒用)。packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;publicclassTestDemo publicstaticvoidmain(String args)throwsException List all =n
57、ewArrayList();Collections.addAll(all,A,B,C);System.out.println(all);Collections.reverse(all) ;System.out.println(all);面試題:請解釋Collection和Collections的區(qū)別?Collection是一個(gè)接口,用于定義集合操作的標(biāo)準(zhǔn);Collections是一個(gè)工具類,可以操作任意的集合對象。3.9、屬性操作類:Properties(理解)屬性一般都是指的是針對于字符串?dāng)?shù)據(jù),并且所有的字符串?dāng)?shù)據(jù)都會(huì)按照“key = value”的形式保存,屬性操作類主要是針對于屬性文件完
58、成的。Properties類本身是Hashtable的子類:public class Properties extends Hashtable但是在使用方法上操作的并不是由Map接口定義的方法,使用Properties自己的方法:設(shè)置屬性:public Object setProperty(String key, String value);取得(qd)屬性:public String getProperty(String key),如果沒有(mi yu)指定的key返回(fnhu)null;取得屬性:public String getProperty(String key, String d
59、efaultValue),如果沒有指定的key,返回默認(rèn)值。范例:觀察屬性的設(shè)置和取得packagecn.mldn.demo;importjava.util.Properties;publicclassTestDemo publicstaticvoidmain(String args)throwsException Properties pros =newProperties();pros.setProperty(BJ,BeiJing);pros.setProperty(SH,上海);System.out.println(pros.getProperty(BJ);System.out.prin
60、tln(pros.getProperty(TJ);System.out.println(pros.getProperty(TJ,沒有發(fā)現(xiàn));但是使用Properties類最方便的特點(diǎn)是可以直接將這些屬性以O(shè)utputStream的方式或InputStream的方式輸出或讀?。合蜉敵隽髦休敵鰧傩裕簆ublic void store(OutputStream out, String comments) throws IOException;從輸入流中讀取屬性:public void load(InputStream inStream) throws IOException。范例:將屬性保存到文件之
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理人員勞動(dòng)合同示例
- 房屋建筑白蟻預(yù)防施工協(xié)議
- 鐵礦石海運(yùn)合同模板
- 店面轉(zhuǎn)讓協(xié)議樣本-合同范本
- 家政服務(wù)用工合同樣本
- 資產(chǎn)委托管理合同
- 商標(biāo)許可使用合同范例
- 工業(yè)用途土地買賣合同參考
- 漁業(yè)養(yǎng)殖承包協(xié)議書-合同范本
- 股權(quán)投資協(xié)議范本匯編
- 檢驗(yàn)科標(biāo)本采集課件
- 直銷成功之推崇配合帶動(dòng)教學(xué)課件
- 低倍組織檢驗(yàn)課件
- GB 19517-2023國家電氣設(shè)備安全技術(shù)規(guī)范
- 一代元帥劉伯承
- 學(xué)科分析:中等職業(yè)教育“民族音樂與舞蹈”專業(yè)學(xué)科分析
- 單層工業(yè)廠房結(jié)構(gòu)吊裝
- 消音器研究報(bào)告
- 高中冬季安全教育班會(huì)ppt
- 房地產(chǎn):融創(chuàng) -建筑行業(yè)第三方測評體系宣貫
- GBZ(衛(wèi)生) 18-2013職業(yè)性皮膚病的診斷總則
評論
0/150
提交評論