《Java程序設(shè)計(jì)及應(yīng)用》課件08_第1頁
《Java程序設(shè)計(jì)及應(yīng)用》課件08_第2頁
《Java程序設(shè)計(jì)及應(yīng)用》課件08_第3頁
《Java程序設(shè)計(jì)及應(yīng)用》課件08_第4頁
《Java程序設(shè)計(jì)及應(yīng)用》課件08_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

內(nèi)容提要引入集合框架的原因IteratorCollectionListLinkedListArrayListVectorStackSetHashSetQueue引入集合框架的原因處理集合數(shù)據(jù),Java中已經(jīng)有了數(shù)組,數(shù)組便于隨機(jī)訪問,效率高,但有如下缺點(diǎn):(1)數(shù)組一旦分配了空間個(gè)數(shù),其大小就不能再改變;(2)數(shù)組中所有元素的數(shù)據(jù)類型都必須相同;(3)不能對(duì)數(shù)組實(shí)施插入或者刪除操作;(4)無法判斷數(shù)組中實(shí)際存有多少元素,length只是告訴數(shù)組的容量。為了克服這些缺點(diǎn),Java引入了集合框架,采用一系列集合對(duì)象來處理集合數(shù)據(jù),這些集合對(duì)象就好比是一個(gè)容器,里面可以存放不同引用類型的數(shù)據(jù),容器的大小也可以根據(jù)需要靈活調(diào)整,可以方便地把對(duì)象添加到容器中或從容器中刪除,故集合也稱為容器。集合框架概述集合框架劃分為兩大類:Collection和Map,后者中存儲(chǔ)的元素是key-value對(duì),而前者中存儲(chǔ)的元素是單個(gè)的對(duì)象,不是key-value對(duì)。Collection接口有三個(gè)子接口:List(列表)、Set(集合)和Queue(隊(duì)列)。List強(qiáng)調(diào)了其內(nèi)元素的有序性,從而允許其內(nèi)有重復(fù)的元素;Set與數(shù)學(xué)上集合的概念相同,其內(nèi)的元素具有互異性和無序性;Queue就是數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列,強(qiáng)調(diào)先進(jìn)先出的操作順序。集合中存放的元素類型都為Object,而想在集合中使用基本數(shù)據(jù)類型,則需要使用其對(duì)應(yīng)的包裝類:boolean(Boolean),byte(Byte),char(Chararter),short(Short),int(Integer),long(Long),float(Float),double(Double)。IteratorIterator是為遍歷集合提供的迭代器。Iterator取代了Enumeration。要掌握一個(gè)接口或類的使用,應(yīng)從如下幾個(gè)方面來把握,這是學(xué)習(xí)方法,請(qǐng)讀者務(wù)必掌握。(1)接口或類的聲明和功能說明。(2)類的構(gòu)造方法(接口沒有)。(3)接口或類的功能方法。Iterator的聲明是:publicinterfaceIterator<E>Iterator只有三個(gè)方法:(1)booleanhasNext():如果仍有元素可以迭代,則返回true。(2)Enext():返回迭代的下一個(gè)元素。(3)voidremove():從迭代器指向的集合中移除迭代器返回的最后一個(gè)元素。CollectionCollection是最基本的集合接口。JDK提供的類都是繼承自Collection的“子接口”如List、Set、Queue。所有實(shí)現(xiàn)Collection接口的類都必須提供兩個(gè)標(biāo)準(zhǔn)的構(gòu)造方法:一個(gè)是無參數(shù)的構(gòu)造方法,用于創(chuàng)建一個(gè)空的Collection;另一個(gè)是帶Collection參數(shù)的構(gòu)造方法,用于創(chuàng)建一個(gè)新的Collection.Collection聲明Collection的聲明如下:publicinterfaceCollection<E>extendsIterable<E>Collection方法(1)booleanadd(Ee):向該容器中追加一個(gè)元素,追加成功則返回true,否則返回false。(2)voidclear():刪除容器中的所有元素。(3)booleancontains(Objecto):判斷容器是否含有對(duì)象o。(4)booleanisEmpty():判斷此容器是否為空,若為空返回true,否則返回false。(5)Iterator<E>iterator():把容器中的元素轉(zhuǎn)換為一個(gè)用于遍歷的Iterator對(duì)象。(6)booleanremove(Objecto):從容器中刪除指定的元素,如果存在的話。(7)intsize():返回容器中的元素?cái)?shù)。(8)Object[]toArray():把容器中的元素轉(zhuǎn)換到數(shù)組中。(9)<T>T[]toArray(T[]a):返回包含此集合中所有元素的數(shù)組。importjava.util.*;

2classT{

3publicstaticvoidmain(String[]args){

4Collection<String>c=newArrayList<String>();

5c.add("abc");

6c.add("def");

7

8//采用迭代器進(jìn)行遍歷

9Iterator<String>iter=c.iterator();

10while(iter.hasNext()){

11Strings=iter.next();

12System.out.println(s);

13}

14

15//也可以這樣遍歷

16for(Strings:c){

17System.out.println(s);

18}

19}

20}例程ListList是Collection的一個(gè)子接口,List強(qiáng)調(diào)了元素的有序性,不強(qiáng)調(diào)元素的互異性。List的聲明為:publicinterfaceList<E>extendsCollection<E>List方法(1)voidadd(intindex,Eelement):在列表的指定位置插入指定元素。(2)Eget(intindex):返回列表中指定索引位置的元素,索引從0開始。(3)ListIterator<E>listIterator():返回此列表元素的列表迭代器(按適當(dāng)順序)。(4)Eremove(intindex):移除列表中指定位置的元素(可選操作)。(5)Eset(intindex,Eelement):用指定元素替換列表中指定位置的元素。(6)List<E>subList(intfromIndex,inttoIndex):返回從fromIndex(含)到toIndex(不含)的子列表。List接口實(shí)現(xiàn)類實(shí)現(xiàn)List接口的常用類有LinkedList、ArrayList、Vector和Stack。LinkedList類從名字可以看出LinkedList采用鏈表作為數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)所有鏈表操作。除了實(shí)現(xiàn)List接口外,LinkedList類還為在鏈表的開頭及結(jié)尾的get、remove和insert元素提供了統(tǒng)一的命名方法。這些操作允許將鏈接鏈表用作堆棧(Stack)、隊(duì)列(Queue)或雙端隊(duì)列(Deque)。LinkedList構(gòu)造方法LinkedList類的構(gòu)造方法:LinkedList():構(gòu)造一個(gè)空列表。LinkedList(Collection<?extendsE>c):構(gòu)造一個(gè)包含指定Collection中的元素的列表,這些元素按其collection的迭代器返回的順序排列。LinkedList功能方法(1)booleanadd(Ee):將指定元素添加到此列表的結(jié)尾。(2)voidadd(intindex,Eelement):在此列表中指定的位置插入指定的元素。(3)voidaddFirst(Ee):將指定元素插入此列表的開頭。(4)voidaddLast(Ee):將指定元素添加到此列表的結(jié)尾。(5)Eelement():獲取但不移除此列表的頭(第一個(gè)元素)。(6)Eget(intindex):返回此列表中指定位置處的元素。(7)EgetFirst():返回此列表的第一個(gè)元素。(8)EgetLast():返回此列表的最后一個(gè)元素。(9)intindexOf(Objecto):返回首次出現(xiàn)的指定元素的索引,若無該元素,則返回-1。(10)booleanoffer(Ee):將指定元素添加到此列表的末尾(最后一個(gè)元素)。(11)booleanofferFirst(Ee):在此列表的開頭插入指定的元素。(12)booleanofferLast(Ee):在此列表末尾插入指定的元素。(13)Epeek():獲取但不移除此列表的頭(第一個(gè)元素)。(14)EpeekFirst():獲取但不移除此列表的首元素;若列表為空,則返回null。(15)EpeekLast():獲取但不移除此列表的尾元素;若列表為空,則返回null。(16)Epoll():獲取并移除此列表的頭(第一個(gè)元素)。(17)EpollFirst():獲取并移除此列表的首元素;若列表為空,則返回null。(18)EpollLast():獲取并移除此列表的尾元素;若列表為空,則返回null。(19)Epop():從此列表所表示的堆棧處彈出一個(gè)元素。(20)voidpush(Ee):將元素推入此列表所表示的堆棧。(21)Eremove():獲取并移除此列表的頭(第一個(gè)元素)。(22)Eremove(intindex):移除此列表中指定位置處的元素。(23)Eset(intindex,Eelement):將此列表中指定位置的元素替換為指定的元素。ArrayList類ArrayList實(shí)現(xiàn)了可變大小的數(shù)組。它允許存儲(chǔ)所有元素,包括null。每個(gè)ArrayList實(shí)例都有一個(gè)容量(Capacity),即用于存儲(chǔ)元素?cái)?shù)組的大小。這個(gè)容量可隨著不斷添加新元素而自動(dòng)增加,但是增長算法并沒有定義。當(dāng)需要插入大量元素時(shí),在插入前可以調(diào)用ensureCapacity方法來增加ArrayList的容量以提高插入效率。此類大致上等同于Vector類,除了此類不是多線程同步的,從而該類的方法執(zhí)行速度要比Vector快。ArrayList構(gòu)造方法構(gòu)造方法如下:ArrayList():構(gòu)造一個(gè)空列表,其容量大小采用默認(rèn)值。ArrayList(Collection<?extendsE>c):構(gòu)造一個(gè)包含指定collection的元素的列表,這些元素是按照該Collection的迭代器返回的順序排列的。ArrayList(intinitialCapacity):構(gòu)造一個(gè)具有指定初始容量的空列表。ArrayList功能方法booleanadd(Ee)voidadd(intindex,Eelement)voidclear()Objectclone()booleancontains(Objecto)voidensureCapacity(intminCapacity)Eget(intindex)intindexOf(Objecto)booleanisEmpty()intlastIndexOf(Objecto)Eremove(intindex)booleanremove(Objecto)intsize()Object[]toArray()<T>T[]toArray(T[]a)voidtrimToSize()Vector類Vector非常類似ArrayList,但Vector是同步的。由Vector創(chuàng)建的Iterator雖然和ArrayList創(chuàng)建的Iterator是同一接口,但是,因?yàn)閂ector是同步的,當(dāng)一個(gè)Iterator被創(chuàng)建而且正在被使用,若另一個(gè)線程改變了Vector的狀態(tài)(例如,添加或刪除了一些元素),這時(shí)調(diào)用Iterator的方法時(shí)將拋出ConcurrentModificationException,因此必須捕獲該異常。ArrayList不是同步的,故速度快于Vector,但安全性不及Vector。Stack類Stack的聲明為:publicclassStack<E>extendsVector<E>Stack是Vector的子類,實(shí)現(xiàn)一個(gè)后進(jìn)先出的棧(一種數(shù)據(jù)結(jié)構(gòu))。Stack類提供了棧操作方法:Epush(Eitem)//入棧

Epop()//出棧

Epeek()//得到棧頂?shù)脑?/p>

booleanempty()//測(cè)試堆棧是否為空

intsearch(Objectobj)//檢測(cè)一個(gè)元素在堆棧中的位置,以1為基數(shù);

//返回值-1表示此對(duì)象不在堆棧中Set/HashSet/QueueSetSet是Collection的子接口,描述了數(shù)學(xué)上的集合概念,強(qiáng)調(diào)了所存儲(chǔ)元素的互異性。Set中的方法同Collection。HashSet類HashSet類實(shí)現(xiàn)了Set接口,由哈希表支持。它不保證Set的遍歷順序;特別是它不保證該順序恒久不變。此類允許使用null元素。QueueQueue隊(duì)列,是一種數(shù)據(jù)結(jié)構(gòu),遵循先進(jìn)先出的操作原則,是從JDK1.5開始新加入的,Queue繼承了Collection接口。MapMap存儲(chǔ)的是key-value對(duì),Map中的key具有互異性。Map有兩種比較常用的實(shí)現(xiàn):HashMap、HashTable和TreeMap。它們都有同樣的基本接口Map,但是行為特性各不相同,這表現(xiàn)在效率、鍵值對(duì)的保存及呈現(xiàn)次序、映射表如何在多線程程序中工作和判定“key”等價(jià)的策略這些方面。Map的聲明為:publicinterfaceMap<K,V>。其基本方法是put()和get()。性能是映射表中的一個(gè)重要問題,當(dāng)在get()中使用線性搜索時(shí),執(zhí)行速度會(huì)相當(dāng)慢,而要提高速度,就要使用HashMap。HashMap/Hashtable類HashMap使用了散列碼來取代線性搜索鍵,這極大提高了HashMap的性能。下面例子演示了HashMap的用法:1importjava.util.*;

2classT{

3publicstaticvoidmain(String[]args){

4Map<String,Integer>m=newHashMap<String,Integer>();

5m.put("a",1);

6m.put("b",2);

7m.put("c",3);

8Set<String>s=m.keySet();

9for(Stringkey:s){

10System.out.println(key+":"+m.get(key));

11}

12}

13}二者的比較Hashtable與HashMap功能類似,不同點(diǎn)在于:HashMap不是線程同步的,但允許使用null鍵和null值;而Hashtable則恰好相反。HashMap不是線程同步的,因此HashMap的執(zhí)行速度比Hashtable快,但線程安全度沒有保障。Properties類java.util.Properties是java.util.Hashtable的子類,用于表示key-value的屬性集合,這里要求key與value的類型都是String類型,而Hashtable要求key和value的類型都是Object。Properties對(duì)象是properties文件的一個(gè)內(nèi)存對(duì)象映射。所謂properties文件是一個(gè)純文本文件,其文件名的后綴為.properties,文件內(nèi)容的格式是每行一對(duì)key-value屬性,其中以#開頭的行為注釋,如下:1#這是注釋行。

2name=Zhangsan

3key1=abc

4k.k.k=def

5animal.dog=狗注意在“=”的兩邊不能有空格字符。把上面的內(nèi)容存入文件perties,以備后面的例程使用。properties文件在程序中有很多用途,例如可以用于軟件的配置文件,也可以用作軟件界面的文字資源等,在GUI編程中的國際化(I18N)界面采用的就是properties文件,詳見11.9節(jié)??梢允褂肞roperties類中的如下方法讀寫properties文件:load(Reader)/store(Writer,String)//使用unicode字符編碼

load(InputStream)/store(OutputStream,String)//功能同上,但不涉及字符編碼問題由于properties文件是純文本字符文件,所以通常采用方法load(Reade

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論