第十二天-類集框架JDBC_第1頁(yè)
第十二天-類集框架JDBC_第2頁(yè)
第十二天-類集框架JDBC_第3頁(yè)
第十二天-類集框架JDBC_第4頁(yè)
第十二天-類集框架JDBC_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、3.1、認(rèn)識(shí)類集(理解)如果現(xiàn)在要想保存多個(gè)對(duì)象,肯定使用對(duì)象數(shù)組完成,但是對(duì)象數(shù)組本身有一個(gè)最大的問(wèn)題在于其數(shù)據(jù)的長(zhǎng)度,所以后來(lái)使用了鏈表完成了動(dòng)態(tài)對(duì)象數(shù)組的開(kāi)發(fā),可是鏈表的開(kāi)發(fā)難度實(shí)在是很大,而且如果一個(gè)鏈表要想真正去使用,只依靠之前所編寫(xiě)的還不夠,還需要進(jìn)行一些代碼的調(diào)優(yōu)。而在JDK 1.2之后正式引入了類集的概念,類集是一種動(dòng)態(tài)的對(duì)象數(shù)組,屬于各個(gè)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)類,在整個(gè)類集之中主要的組成是一些核心的操作接口:Collection、List、Set、Map、Iterator、Enumeration。3.2、單值保存的最大父接口:Collection(重點(diǎn))所謂的單值保存指的是每一次操作

2、只會(huì)保存一個(gè)對(duì)象,就好像之前的鏈表程序一樣,每一次只保存了一個(gè)對(duì)象,在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 o)普通刪除數(shù)據(jù)7public int

3、 size()普通取得集合的個(gè)數(shù)8public Object toArray()普通將集合變?yōu)閷?duì)象數(shù)組在Collection接口之中一共定義了15個(gè)方法,在所有的方法之中,只有兩個(gè)方法最為常用:add()、iterator()。不過(guò)從開(kāi)發(fā)上講,很少會(huì)去直接使用Collection,都會(huì)使用Collection的兩個(gè)子接口:List、Set。3.3、允許重復(fù)的子接口:List(重點(diǎn),80%)List是Collection的一個(gè)最為常用的子接口,首先這個(gè)接口的定義如下:public interface List extends Collection但是List接口對(duì)Collection接口進(jìn)行了大

4、量的擴(kuò)充,但是擴(kuò)充之后的主要方法:No.方法名稱類型描述1public E get(int index)普通取得指定索引位置上的數(shù)據(jù)2public E set(int index, E element)普通修改指定索引位置上的數(shù)據(jù)3public ListIterator listIterator()普通為L(zhǎng)istIterator接口實(shí)例化但是以上的三個(gè)方法,只是針對(duì)于List接口起作用,而List接口有兩個(gè)常用子類:ArrayList、Vector。3.3.1、新的子類:ArrayList,95%ArrayList是List子接口使用最多的一個(gè)子類,而這個(gè)類的定義如下:public class

5、 ArrayListextends AbstractListimplementsList, RandomAccess, Cloneable, Serializable按照面向?qū)ο蟮母拍顏?lái)講,現(xiàn)在使用ArrayList主要的目的是為L(zhǎng)ist接口實(shí)例化,所有的操作方法都以List接口為主。范例:使用ArrayList進(jìn)行List接口的功能驗(yàn)證packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.List;publicclassTestDemo publicstaticvoidmain(String args)throwsExce

6、ption 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集合修改之前的程序packagecn.mldn.demo;importjava.util.A

7、rrayList;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) ;/需要equals()publicList search(String keyWord)

8、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) = name ;this.age= age ;publicString ge

9、tName() 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 toString() return狗的信息名字:+,年齡:+this.age;classT

10、igerimplementsAnimal 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(!(objinstanceofTiger) returnfalse;Tiger t =

11、 (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) ;zoo.add(newDog(斑點(diǎn)狗,1) ;zoo.add(newTig

12、er(斑點(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í)的程序不再需要自己去開(kāi)發(fā)鏈表了,所有的鏈表的實(shí)現(xiàn)類都有了。3.3.2、舊的子類:Vector,5%Vector類是在JDK 1.0的時(shí)候就推出的一個(gè)最早的實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的操作類,實(shí)際上對(duì)于今天而言,有許多的類上依然

13、還是在使用著Vector,不過(guò)從實(shí)際的開(kāi)發(fā)來(lái)講,現(xiàn)在設(shè)計(jì)的一些程序都是針對(duì)于接口的操作了。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.add(World) ;for(intx = 0; x all.size(); x+) String str =

14、all.get(x) ;/ get()方法只有List接口有System.out.print(str +、);因?yàn)樗械牟僮鞫际轻槍?duì)于接口完成的,接口定義的方法不變,子類隨便變。面試題:請(qǐng)解釋ArrayList和Vector的區(qū)別?No.區(qū)別ArrayListVector1推出時(shí)間JDK 1.2JDK 1.02性能采用異步處理方式,性能更高采用同步處理方式,性能相對(duì)較低3安全性非線程安全線程安全4輸出Iterator、ListIterator、foreachIterator、ListIterator、foreach、Enumeration從實(shí)際開(kāi)發(fā)而言,幾乎都是開(kāi)發(fā)異步程序,所以首選的肯定是A

15、rrayList子類。3.4、不允許重復(fù)的子接口:Set(重點(diǎn)),20%Set也是一個(gè)Collection較為常用的子接口,這個(gè)接口的定義如下:public interface Set extends Collection在Collection接口定義了15個(gè)方法,但是Set子接口并不像List子接口那樣對(duì)Collection接口進(jìn)行了大量的擴(kuò)充,而是完整的繼承了下來(lái),那么就證明了在Set子接口之中是肯定無(wú)法使用get()方法的。那么在Set子接口之中常用的兩個(gè)子類:HashSet、TreeSet,下面分別說(shuō)明。3.4.1、散列存放的子類:HashSet,80%Hash(哈希)屬于一種算法,這

16、種算法的核心意義指的是找空保存算法,所以只要一看見(jiàn)hash第一反應(yīng)就是說(shuō)沒(méi)有順序的保存。范例:觀察Set接口使用packagecn.mldn.demo;importjava.util.HashSet;importjava.util.Set;publicclassTestDemo publicstaticvoidmain(String args)throwsException Set all =newHashSet() ;all.add(Hello) ;all.add(Hello) ;/內(nèi)容重復(fù)了all.add(World) ;System.out.println(all);保存數(shù)據(jù)再輸出之后可

17、以發(fā)現(xiàn),重復(fù)的數(shù)據(jù)沒(méi)有了,并且其本身的保存也是沒(méi)有任何順序的。3.4.2、排序存放的子類:TreeSet,20%如果現(xiàn)在希望Set集合之中保存的數(shù)據(jù)有順序,那么就通過(guò)TreeSet進(jìn)行Set接口的實(shí)例化。范例:使用TreeSetpackagecn.mldn.demo;importjava.util.Set;importjava.util.TreeSet;publicclassTestDemo publicstaticvoidmain(String args)throwsException Set all =newTreeSet() ;all.add(D) ;all.add(A) ;/內(nèi)容重復(fù)了

18、all.add(B) ;all.add(B) ;all.add(C) ;System.out.println(all);現(xiàn)在發(fā)現(xiàn)所有保存的數(shù)據(jù)沒(méi)有重復(fù)且有序排列。3.4.3、關(guān)于TreeSet排序的說(shuō)明(重點(diǎn))通過(guò)之前的程序可以發(fā)現(xiàn),使用TreeSet實(shí)例化Set接口之中,所有保存的數(shù)據(jù)都是有序的,那么在這種情況下,那么如果說(shuō)使用的是一個(gè)自定義的類呢?那么這個(gè)時(shí)候如果這個(gè)類對(duì)象要進(jìn)行排序的話,則這個(gè)類必須實(shí)現(xiàn)Comparable接口,設(shè)置比較規(guī)則。但是在這種情況下有一點(diǎn)必須注意:一旦使用了Comparable之后,類之中的所有屬性都必須寫(xiě)進(jìn)排序規(guī)則。范例:自定義類排序packagecn.mld

19、n.demo;importjava.util.Set;importjava.util.TreeSet;classPersonimplementsComparable privateStringname;privateintage;publicPerson(String name,intage) = name ;this.age= age ;OverridepublicString toString() return姓名:+,年齡:+this.age+n;OverridepublicintcompareTo(Person o) if(this.age o.age) return1 ;elseif

20、(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) ;/年齡重復(fù)all.add(newPerson(王五,19) ;all.add(newPerson(趙六,21) ;System.out.println(all

21、);TreeSet子類依靠Comparable中compareTo()方法的返回值是否為0來(lái)判斷是否為重復(fù)元素。3.4.4、關(guān)于重復(fù)元素的說(shuō)明那么TreeSet依靠Comparable進(jìn)行重復(fù)元素判斷,那么HashSet可以嗎?發(fā)現(xiàn)以上的程序換為了HashSet之后,該有的重復(fù)還是有,因?yàn)閺恼嬲囊饬x上來(lái)講,判斷重復(fù)元素依靠的不是Comparable(只有排序的時(shí)候才依靠Comparable),所有的重復(fù)元素的判斷依靠于Object類的兩個(gè)方法:hash碼:public int hashCode();對(duì)象比較:public boolean equals(Object obj)。在進(jìn)行對(duì)象比較的

22、過(guò)程之中,首先會(huì)先使用hashCode()與已保存在集合之中的對(duì)象的hashCode()進(jìn)行比較,如果代碼相同,則再使用equals()方法進(jìn)行屬性的依次判斷,如果全部相同,則為相同元素。那么為了保證每一個(gè)對(duì)象的hashCode()不一樣,需要設(shè)計(jì)一組數(shù)學(xué)公式才可以,會(huì)嗎?范例:重復(fù)元素packagecn.mldn.demo;importjava.util.HashSet;importjava.util.Set;classPerson privateStringname;privateintage;publicPerson(String name,intage) = name ;this.ag

23、e= age ;OverridepublicString toString() return姓名:+,年齡:+this.age+n;OverridepublicinthashCode() finalintprime = 31;intresult = 1;result = prime * result +age;result = prime * result + (name=null) ? 0 :name.hashCode();returnresult;Overridepublicbooleanequals(Object obj) if(this= obj)returntrue;if(obj =

24、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;publicclassTestDemo publicstaticvoidmain(String args)throwsException Set all =newHashSet() ;all.add(n

25、ewPerson(張三,20) ;all.add(newPerson(張三,20) ;/全部重復(fù)all.add(newPerson(李四,20) ;/年齡重復(fù)all.add(newPerson(王五,19) ;all.add(newPerson(趙六,21) ;System.out.println(all);至此,Object類之中的全部方法就講解完成了。3.5、集合的輸出操作(重點(diǎn))在之前所介紹的都屬于單值集合的基本操作,可是對(duì)于集合有一個(gè)最為重要的問(wèn)題就是如何進(jìn)行集合內(nèi)容的輸出操作,而這個(gè)問(wèn)題在Java的類集框架之中給出了四種輸出方式:Iterator、ListIterator、Enume

26、ration、foreach。3.5.1、迭代輸出:Iterator(核心),95%Iterator是最為常用的集合輸出接口,在這個(gè)接口中一共定義了三個(gè)方法,但只有兩個(gè)有真正用處:判斷是否有下一個(gè)元素:public boolean hasNext();取得下一個(gè)元素:public E next()。在Iterator接口之中存在了一個(gè)remove()方法,但是這個(gè)方法真沒(méi)用。而且在之前學(xué)習(xí)的Scanner也是Iterator的子類。但是如何取得Iterator接口的實(shí)例化對(duì)象呢?這一操作在Collection接口就已經(jīng)明確定義了,因?yàn)镃ollection繼承了一個(gè)Iterable接口,在這個(gè)接

27、口下定義了一個(gè)方法:public Iterator iterator(),取得Iterator接口的實(shí)例化對(duì)象,但是與之前在IO操作部分學(xué)習(xí)的一樣,OutputStream實(shí)現(xiàn)了Closeable和Flushable兩個(gè)接口,但是這兩個(gè)接口屬于新的接口,和這兩個(gè)接口一樣,Iterable接口也是在JDK 1.5的時(shí)候出現(xiàn)的,那么基本上也不會(huì)去關(guān)心這兩個(gè)接口,因?yàn)镃ollection接口中也已經(jīng)明確定義了iterator()方法。范例:使用Iterator輸出集合數(shù)據(jù)packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.Ite

28、rator;importjava.util.List;publicclassTestDemo publicstaticvoidmain(String args)throwsException List all =newArrayList();all.add(Hello);all.add(Hello);/內(nèi)容重復(fù)了all.add(World);Iterator iter = all.iterator();while(iter.hasNext() /判斷是否有下一個(gè)元素String str = iter.next() ;System.out.print(str +、);以后只要是見(jiàn)到了集合的輸出操

29、作,永遠(yuǎn)都使用Iterator接口完成。3.5.2、雙向迭代輸出:ListIterator(了解),0.09%Iterator可以完成的是由前向后的單向輸出操作,如果現(xiàn)在希望可以完成由前向后,和由后向前輸出的話,那么就可以利用ListIterator接口完成,此接口是Iterator的子接口,在ListIterator接口主要使用以下兩個(gè)擴(kuò)充方法:判斷是否有前一個(gè)元素:public boolean hasPrevious();取出前一個(gè)元素:public E previous()。但是如果要想取得ListIterator接口的實(shí)例化對(duì)象,Collection沒(méi)有這樣的方法支持,這個(gè)方法在Lis

30、t接口之中存在:public ListIterator listIterator()。范例:執(zhí)行雙向迭代packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.List;importjava.util.ListIterator;publicclassTestDemo publicstaticvoidmain(String args)throwsException List all =newArrayList();all.add(Hello);all.add(Hello);/內(nèi)容重復(fù)了all.add(World);ListIte

31、rator iter = all.listIterator();System.out.print(由前向后輸出:);while(iter.hasNext() /判斷是否有下一個(gè)元素String str = iter.next() ;System.out.print(str +、);System.out.print(n由后向前輸出:);while(iter.hasPrevious() String str = iter.previous() ;System.out.print(str +、);但是對(duì)于由后向前的輸出操作,在進(jìn)行之前一定要首先發(fā)生由前向后的輸出。由于此輸出接口只有List可以使用,

32、所以在開(kāi)發(fā)之中幾乎不會(huì)出現(xiàn)。3.5.3、廢棄的接口:Enumeration(重點(diǎn)),4.9%Enumeration是一個(gè)最早的輸出接口,最早稱為枚舉輸出,在JDK 1.0的時(shí)候就已經(jīng)推出了,并且在JDK 1.5的時(shí)候?qū)⑵涔δ苓M(jìn)行了擴(kuò)充,主要就是增加了泛型,在Enumeration接口里面只定義了兩個(gè)方法:判斷是否有下一個(gè)元素:public boolean hasMoreElements();取得當(dāng)前元素:public E nextElement();不過(guò)要想取得Enumeration的實(shí)例化對(duì)象,不能依靠Collection接口了,只能夠依靠Vector類完成,在Vector子類之中定義了如下

33、一個(gè)方法:publicEnumerationelements()。范例:使用Enumeration進(jìn)行輸出packagecn.mldn.demo;importjava.util.Enumeration;importjava.util.Vector;publicclassTestDemo publicstaticvoidmain(String args)throwsException Vector all =newVector();all.add(Hello);all.add(Hello);/內(nèi)容重復(fù)了all.add(World);Enumeration enu = all.elements()

34、;while(enu.hasMoreElements() String str = enu.nextElement();System.out.print(str +、);從開(kāi)發(fā)而言,首先考慮絕對(duì)不是Enumeration,考慮的肯定是Iterator,只有在必須使用的時(shí)候才用它。3.5.4、JDK 1.5的支持:foreach(理解),0.01%對(duì)于foreach輸出除了可以進(jìn)行數(shù)組內(nèi)容的輸出之外,也可以針對(duì)于集合完成輸出。范例:使用foreachpackagecn.mldn.demo;importjava.util.ArrayList;importjava.util.List;publicc

35、lassTestDemo publicstaticvoidmain(String args)throwsException List all =newArrayList();all.add(Hello);all.add(Hello);/內(nèi)容重復(fù)了all.add(World);for(String str : all) System.out.print(str +、);使用foreach并不是一個(gè)被廣泛認(rèn)可的操作代碼形式。3.6、偶對(duì)象保存:Map接口(重點(diǎn))偶對(duì)象指的是一對(duì)對(duì)象,即:兩個(gè)對(duì)象要同時(shí)保存。這兩個(gè)對(duì)象是按照了“key =value”的形式進(jìn)行定義的,即:可以通過(guò)key找到對(duì)應(yīng)的va

36、lue數(shù)據(jù),就好象電話號(hào)碼本一樣,例如,電話號(hào)碼本之中保存了如下的信息:key =張三,value = 123456;key =李四,value = 234567;現(xiàn)在如果要想找到張三的電話,那么肯定根據(jù)張三的key,取得對(duì)應(yīng)的value,而如果現(xiàn)在要想找王五的電話,由于沒(méi)有王五這個(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)普通通過(guò)指定的key取得對(duì)應(yīng)的value3public

37、 Set keySet()普通將Map中的所有key以Set集合的方式返回4public SetMap.Entry entrySet()普通將Map集合變?yōu)镾et集合在Map接口之中有兩個(gè)常用的子類:HashMap、Hashtable。3.6.1、新的子類:HashMap,95%HashMap是Map接口之中使用最多的一個(gè)子類,這個(gè)子類的定義如下:public class HashMapextends AbstractMapimplementsMap, Cloneable, Serializable下面就直接通過(guò)HashMap演示Map接口中各個(gè)主要方法的作用。范例:驗(yàn)證Map方法packag

38、ecn.mldn.demo;importjava.util.HashMap;importjava.util.Map;publicclassTestDemo publicstaticvoidmain(String args)throwsException Map map =newHashMap();map.put(3,張三);map.put(null,無(wú)名氏);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(

39、null);通過(guò)這一代碼可以發(fā)現(xiàn),Map和Collection在操作上的不同:Collection接口設(shè)置完的內(nèi)容目的是為了輸出;Map接口設(shè)置完內(nèi)容的目的是為了查找。范例:取得全部的key,全部的key通過(guò)Set集合返回packagecn.mldn.demo;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;publicclassTestDemo publicstaticvoidmain(String args)throwsException Map map =ne

40、wHashMap();map.put(3,張三);map.put(null,無(wú)名氏);map.put(3,李四);/ key重復(fù),value會(huì)被新內(nèi)容覆蓋map.put(1,王五);map.put(0,趙六);Set set = map.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.

41、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.demo;importjava.util.Hashtable;importjava.util.Map;publicclassTestDemo publicstaticvoidmain(String args)throwsException Map map =newHashtable();map.put(3,張三);map.put(3,李四);/ key重復(fù),va

42、lue會(huì)被新內(nèi)容覆蓋map.put(1,王五);map.put(0,趙六);System.out.println(map.get(3);System.out.println(map.get(10);這個(gè)時(shí)候在使用Hashtable子類的時(shí)候,里面的數(shù)據(jù)不能有null。面試題:請(qǐng)解釋HashMap和Hashtable的區(qū)別?No.區(qū)別HashMapHashtable1推出時(shí)間JDK 1.2JDK 1.02性能采用異步處理方式,性能更高采用同步處理方式,性能相對(duì)較低3安全性非線程安全線程安全4設(shè)置null允許將key或value設(shè)置為null不允許出現(xiàn)null,否則出現(xiàn)空指向異常3.6.3、關(guān)于M

43、ap集合的輸出問(wèn)題(核心)對(duì)于集合操作,在之前就一直強(qiáng)調(diào):只要是集合的輸出都使用Iterator完成,但是對(duì)于現(xiàn)在的Map集合就麻煩了,因?yàn)镸ap接口之中并沒(méi)有提供像Collection接口那樣的iterator()方法,所以如何使用Iterator輸出Map集合呢?如果要想真正的去思考Map接口通過(guò)Iterator輸出,那么首先需要來(lái)觀察一個(gè)Map.Entry接口,此接口定義如下:publicstaticinterface Map.Entry很明顯,這是一個(gè)在Map接口之中使用static定義的一個(gè)內(nèi)部接口。而且通過(guò)Map接口的定義也可以發(fā)現(xiàn)此內(nèi)部接口的存在。而在Map.Entry這個(gè)內(nèi)部接

44、口之中還存在有以下的兩個(gè)常用方法:取得當(dāng)前的key:public K getKey();取得當(dāng)前的value:public V getValue()。下面通過(guò)一個(gè)圖形來(lái)對(duì)比一下Collection和Map接口保存的數(shù)據(jù)形式。通過(guò)以上的對(duì)比可以發(fā)現(xiàn),在Map集合和Collection集合之中保存的最大區(qū)別:Collection直接保存的是要操作對(duì)象,而Map集合是將保存的key和value變成了一個(gè)Map.Entry對(duì)象,通過(guò)這個(gè)對(duì)象包裝了key和value后保存的,所以根據(jù)這一特征,就可以給出Map使用Iterator輸出的操作步驟:使用Map接口中的entrySet()方法,將Map集合變?yōu)?/p>

45、Set集合;取得了Set接口實(shí)例之后就可以利用iterator()方法取得Iterator的實(shí)例化對(duì)象;使用Iterator迭代找到每一個(gè)Map.Entry對(duì)象,并進(jìn)行key和value的分離。范例:使用Iterator輸出Map集合packagecn.mldn.demo;importjava.util.Hashtable;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;publicclassTestDemo publicstaticvoidmain(String args)throwsException Map

46、 map =newHashtable();map.put(3,張三);map.put(3,李四);/ key重復(fù),value會(huì)被新內(nèi)容覆蓋map.put(1,王五);map.put(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();這種代碼在日后的所有開(kāi)發(fā)之中一定會(huì)出現(xiàn),所以必須會(huì)。面試題:現(xiàn)在

47、在一個(gè)List集合之中保存了多個(gè)String對(duì)象,要求將這個(gè)List集合變?yōu)镾et集合,而后再將這個(gè)Set集合之中的全部數(shù)據(jù)保存在Map集合的value里面,而Map集合的key使用UUID生成,最后將Map中的數(shù)據(jù)進(jìn)行迭代輸出。相關(guān)說(shuō)明:1、在Collection接口之中存在一個(gè)增加一組集合的方法:publicboolean addAll(Collection c);2、UUID是一種算法,在Java中有指定的類,這個(gè)類可以根據(jù)時(shí)間戳生成一個(gè)幾乎不會(huì)重復(fù)的字符串;packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.Has

48、hMap;importjava.util.HashSet;importjava.util.Iterator;importjava.util.List;importjava.util.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()

49、;set.addAll(list);/將List集合加到Set之中Map map =newHashMap();Iterator iter = set.iterator();while(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() + -

50、+ me.getValue();就是把幾個(gè)集合互相折騰了一番。3.6.4、關(guān)于Map中保存key的說(shuō)明通過(guò)程序可以發(fā)現(xiàn),之前的Map集合之中都是使用了系統(tǒng)類作為了Map的key,那么實(shí)際上用戶也可以使用自定義的類作為key出現(xiàn),可是如果要想作為key的類必須注意一點(diǎn):因?yàn)閗ey屬于查找操作,所以要想找到符合的key,那么作為key所在的類就必須覆寫(xiě)Object類之中的兩個(gè)方法:hashCode()、equals()。范例:自定義類作為keypackagecn.mldn.demo;importjava.util.HashMap;importjava.util.Map;classPerson pr

51、ivateStringname;publicPerson(String name) = name;OverridepublicString 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 =nul

52、l)returnfalse;if(getClass() != obj.getClass()returnfalse;Person other = (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.o

53、ut.println(map.get(newPerson(張三);但是這種程序也只是作為學(xué)習(xí)之中的概念出現(xiàn),而在實(shí)際的開(kāi)發(fā)之中,永遠(yuǎn)都是String作為key,因?yàn)樽罘奖恪?.7、Stack類(理解)Stack是棧,棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),Stack類的定義如下:public class Stack extends Vector可以發(fā)現(xiàn)Stack類屬于Vector的子類,但是使用的時(shí)候卻不使用Vector類定義的方法,而使用Stack類自己的方法:入棧操作:public E push(E item);出棧操作:public E pop();范例:觀察棧的基本操作packagecn.mldn

54、.demo;importjava.util.Stack;publicclassTestDemo publicstaticvoidmain(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();/沒(méi)數(shù)據(jù)了,出現(xiàn)EmptyStackException對(duì)于棧這一

55、概念在自己編寫(xiě)的代碼之中使用不多,不過(guò)以后的學(xué)習(xí)都會(huì)出現(xiàn)棧的概念,例如:在Android開(kāi)發(fā)之中,多個(gè)Activity之間的互相調(diào)用和返回就是利用了棧。3.8、Collections類(了解)Collections是專門提供的一個(gè)集合的工具類,并沒(méi)有實(shí)現(xiàn)Collection接口,但是在這個(gè)類之中,有許多的操作方法,可以方便的進(jìn)行集合的操作(根本沒(méi)用)。packagecn.mldn.demo;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;publicclassTestDemo publicst

56、aticvoidmain(String args)throwsException List all =newArrayList();Collections.addAll(all,A,B,C);System.out.println(all);Collections.reverse(all) ;System.out.println(all);面試題:請(qǐng)解釋Collection和Collections的區(qū)別?Collection是一個(gè)接口,用于定義集合操作的標(biāo)準(zhǔn);Collections是一個(gè)工具類,可以操作任意的集合對(duì)象。3.9、屬性操作類:Properties(理解)屬性一般都是指的是針對(duì)于字符串

57、數(shù)據(jù),并且所有的字符串?dāng)?shù)據(jù)都會(huì)按照“key = value”的形式保存,屬性操作類主要是針對(duì)于屬性文件完成的。Properties類本身是Hashtable的子類:public class Properties extends Hashtable但是在使用方法上操作的并不是由Map接口定義的方法,使用Properties自己的方法:設(shè)置屬性:public Object setProperty(String key, String value);取得屬性:public String getProperty(String key),如果沒(méi)有指定的key返回null;取得屬性:public Stri

58、ng getProperty(String key, String defaultValue),如果沒(méi)有指定的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(p

59、ros.getProperty(BJ);System.out.println(pros.getProperty(TJ);System.out.println(pros.getProperty(TJ,沒(méi)有發(fā)現(xiàn));但是使用Properties類最方便的特點(diǎn)是可以直接將這些屬性以O(shè)utputStream的方式或InputStream的方式輸出或讀?。合蜉敵隽髦休敵鰧傩裕簆ublic void store(OutputStream out, String comments) throws IOException;從輸入流中讀取屬性:public void load(InputStream inStre

60、am) throws IOException。范例:將屬性保存到文件之中,一般保存屬性文件的后綴都是“*.properties”packagecn.mldn.demo;importjava.io.File;importjava.io.FileOutputStream;importjava.util.Properties;publicclassTestDemo publicstaticvoidmain(String args)throwsException Properties pros =newProperties();pros.setProperty(BJ,BeiJing);pros.set

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論