java面向?qū)ο蟪绦蛟O(shè)計(jì)第十一章_第1頁
java面向?qū)ο蟪绦蛟O(shè)計(jì)第十一章_第2頁
java面向?qū)ο蟪绦蛟O(shè)計(jì)第十一章_第3頁
java面向?qū)ο蟪绦蛟O(shè)計(jì)第十一章_第4頁
java面向?qū)ο蟪绦蛟O(shè)計(jì)第十一章_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Java高級(jí)

第十一章集合框架

主要內(nèi)容:

集合類框架的概念集合類接口與類兩個(gè)特殊的集合類

Java1.0/1.1的集合類集合類框架的概念集合類和集合接口關(guān)系圖所謂框架就是一個(gè)類庫的集合。集合框架就是一個(gè)用來表示和操作集合的統(tǒng)一的架構(gòu),包含了實(shí)現(xiàn)集合的接口與類。集合類和集合接口關(guān)系圖解讀實(shí)線框圖表示集合類;虛線框圖表示集合接口;虛線連接的空心箭頭表示接口之間的繼承或類對(duì)接口的實(shí)現(xiàn)關(guān)系;實(shí)線表示類之間的繼承關(guān)系。實(shí)心箭頭表示一個(gè)接口方法可以返回另一個(gè)接口可引用的實(shí)例。圖中還展示了集合類相關(guān)的一些功能類如:Collections和Arrays,它們封裝有特定的集合操作功能。集合類接口六大集合類接口之一——Collection接口collection是集合類的基本接口,它用來說明作為一個(gè)集合類應(yīng)有的特征屬性并為一組對(duì)象的操作提供了一些簡(jiǎn)單的方法。子接口有:List和Set它的實(shí)現(xiàn)類有:AbstractCollection,AbstractList,AbstractSet,ArrayList,BeanContextServicesSupport,BeanContextSupport,HashSet,LinkedHashSet,LinkedList,TreeSet,Vector。Collection接口提供的主要方法boolean

add(Objectc):用于向集合中添加一個(gè)新元素。boolean

addAll(Collection

c):用于添加一組元素。boolean

remove(Object

o):用于刪除一個(gè)元素。booleanremoveAll(Collectionc):用于刪除一組元素。Object[]toArray():把集合轉(zhuǎn)換成對(duì)象數(shù)組引用返回。Object[]toArray(Object[]a):把集合轉(zhuǎn)換成對(duì)象數(shù)組引用返回。但是類型和參數(shù)a的類型是相同的。booleanisEmpty():用于判斷集合是否為空。Iteratoriterator():用于返回實(shí)現(xiàn)Iterator接口的對(duì)象。Collection接口的子接口List

是Collection的子接口,它具有可以控制的順序,但并沒有定義或限制按什么排序。實(shí)現(xiàn)List接口的類是AbstractList,ArrayList,LinkedList,Vector。Set

不能包含重復(fù)的元素。它的實(shí)現(xiàn)類有AbstractSet,HashSet,LinkedHashSet,TreeSet。SortedSet是Set的子接口,在Set基礎(chǔ)上,要求其元素按照某種自然順序進(jìn)行存儲(chǔ)。它的實(shí)現(xiàn)類有TreeSet。ArrayList我們可以將ArrayList看作是能夠自動(dòng)增長容量的數(shù)組。利用ArrayList的toArray()返回一個(gè)數(shù)組。Arrays.asList()用于返回一個(gè)列表。迭代器(Iterator)給我們提供了一種通用的方式來遍歷集合中的元素。方法名說明booleanhasNext()判斷迭代器是否還存在下一個(gè)元素Objectnext()返回下一個(gè)元素的引用voidremove()從集合中刪除迭代器指向的最后一個(gè)元素返回的元素刪除的元素next()remove()next()Collections排序:Collections.sort()①自然排尋(naturalordering);②實(shí)現(xiàn)比較器(Comparator)接口。取最大/最小元素:Collections.max()、Collections.min()。在已排序的List中搜索指定的元素:Collectons.binarySearch()。LinkedList線性表:必存在唯一的稱為“第一個(gè)”和“最后一個(gè)”的數(shù)據(jù)元素;除第一個(gè)和最后一個(gè)元素外,每個(gè)元素都有且只有一個(gè)前驅(qū)元素,都有且只有一個(gè)后繼元素。線性表按其存儲(chǔ)結(jié)構(gòu)可分為順序表和鏈表。LinkedList是采用雙向循環(huán)鏈表實(shí)現(xiàn)的。利用LinkedList實(shí)現(xiàn)棧(stack)、隊(duì)列(queue)、雙向隊(duì)列(double-endedqueue)。單向鏈表的結(jié)構(gòu)datanextdatanextdatanext=nullhead節(jié)點(diǎn)單向鏈表的插入與刪除datanextdatanextdatanext=nullhead節(jié)點(diǎn)datanextdatanextdatanextdatanext=null循環(huán)鏈表的結(jié)構(gòu)datanextdatanextdatanexthead節(jié)點(diǎn)雙向循環(huán)鏈表結(jié)構(gòu)datanextdatanextdatanexthead節(jié)點(diǎn)previouspreviousprevious棧(Stack)棧(Stack)也是一種特殊的線性表,是一種后進(jìn)先出(LIFO)的結(jié)構(gòu)。棧是限定僅在表尾進(jìn)行插入和刪除運(yùn)算的線性表,表尾稱為棧頂(top),表頭稱為棧底(bottom)。棧的物理存儲(chǔ)可以用順序存儲(chǔ)結(jié)構(gòu),也可以用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。a1a2an…棧底棧頂出棧進(jìn)棧隊(duì)列(Queue)隊(duì)列(Queue)是限定所有的插入只能在表的一端進(jìn)行,而所有的刪除都在表的另一端進(jìn)行的線性表。表中允許插入的一端稱為隊(duì)尾(Rear),允許刪除的一端稱為隊(duì)頭(Front)。隊(duì)列的操作是按先進(jìn)先出(FIFO)的原則進(jìn)行的。隊(duì)列的物理存儲(chǔ)可以用順序存儲(chǔ)結(jié)構(gòu),也可以用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。a1a2a3…an隊(duì)頭隊(duì)尾出隊(duì)入隊(duì)ArrayList和LinkedList的比較ArrayList底層采用數(shù)組完成,而LinkedList則是以雙向鏈表(double-linkedlist)完成,其內(nèi)每個(gè)對(duì)象除了數(shù)據(jù)本身外,還有兩個(gè)引用,分別指向前一個(gè)元素和后一個(gè)元素。如果我們經(jīng)常在List的開始處增加元素,或者在List中進(jìn)行插入和刪除操作,我們應(yīng)該使用LinkedList,否則的話,使用ArrayList將更加快速。就ArrayList與Vector主要從三方面來說:同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的。數(shù)據(jù)增長:當(dāng)需要增長時(shí),Vector默認(rèn)增長為原來一倍,而ArrayList卻是原來的一半。ArrayList和Vector的比較HashSet實(shí)現(xiàn)Set接口,依靠HashMap來實(shí)現(xiàn)的。我們通常應(yīng)該為要存放到散列表的各個(gè)對(duì)象重新定義hashCode()和equals()。散列表又稱為哈希表。散列表算法的基本思想是:以結(jié)點(diǎn)的關(guān)鍵字為自變量,通過一定的函數(shù)關(guān)系(散列函數(shù))計(jì)算出對(duì)應(yīng)的函數(shù)值,以這個(gè)值作為該結(jié)點(diǎn)存儲(chǔ)在散列表中的地址。TreeSetTreeSet是依靠TreeMap來實(shí)現(xiàn)的。TreeSet是一個(gè)有序集合,TreeSet中元素將按照升序排列,缺省是按照自然順序進(jìn)行排列,意味著TreeSet中元素要實(shí)現(xiàn)Comparable接口。我們可以在構(gòu)造TreeSet對(duì)象時(shí),傳遞實(shí)現(xiàn)了Comparator接口的比較器對(duì)象。HashSet和TreeSet的比較HashSet是基于Hash算法實(shí)現(xiàn)的,其性能通常都優(yōu)于TreeSet。我們通常都應(yīng)該使用HashSet,在我們需要排序的功能時(shí),我們才使用TreeSet。六大集合類接口之二——Map接口Map接口能夠?qū)⒁粋€(gè)鍵(Key)影射到一個(gè)值(Value),不允許有重復(fù)的鍵,每個(gè)鍵之多有一個(gè)與之對(duì)應(yīng)的值。Map的實(shí)現(xiàn)類有:Hashtable、HashMapSortedMap是Map的子接口,能使Key按照自然順序進(jìn)行存儲(chǔ)。它的實(shí)現(xiàn)類有TreeMap接口為我們提供了完成下面三種主要的功能的方法Map改變:包括關(guān)鍵字/值對(duì)的刪除、更新和插入。Map查詢:允許用戶從Map中獲取關(guān)鍵字/值對(duì)。提供查詢Map元素內(nèi)容的方法,也有用來查詢整個(gè)Map對(duì)象的方法。Map接口的三種視圖keySet()方法獲取的是Map中的關(guān)鍵字的一個(gè)Set(唯一性)。因?yàn)閙ap映射中的關(guān)鍵字是唯一,keySet()方法得到的正好是一個(gè)set。values()方法返回映射中值的Collection(Collection是允許存儲(chǔ)重復(fù)元素的對(duì)象的集合)。因?yàn)镸ap中的值是可以重復(fù)的,values()方法得到的只能是一個(gè)collection而不是一個(gè)Set。entrySet()方法返回Map.Entry的一個(gè)Set。即Map對(duì)象中所存儲(chǔ)的鍵值對(duì)的集合,也就是一個(gè)鍵值對(duì)構(gòu)成的Set。HashMap和TreeMap的比較和Set類似,HashMap的速度通常都比TreeMap快,只有在需要排序的功能的時(shí)候,才使用TreeMap。就HashMap與HashTable主要從三方面來說:歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value

HashMap和Hashtable的比較六大集合類接口之三——Enumeration接口Enumeration接口是一個(gè)對(duì)集合類進(jìn)行遍歷的接口。Enumeration接口提供的方法:booleanhasMoreElements():檢索是否有下一個(gè)對(duì)象,如果有則返回ture;否則返回false。ObjectnextElement():在上一個(gè)方法為true的條件下,返回下一個(gè)Object類型的對(duì)象;如果上一個(gè)方法返回的結(jié)果為false,那么還調(diào)用此方法時(shí)會(huì)產(chǎn)生一個(gè)NoSuchElementException。六大集合類接口之四——Iteraor接口Iteraor接口提供了以下的方法:hasNext():下一個(gè)對(duì)象存在返回ture;否則返回false。next():hasNext()為true時(shí)調(diào)用,返回Object類型的對(duì)象。remove():在提供迭代器實(shí)現(xiàn)對(duì)象的集合中刪除由next()方法指向的一個(gè)對(duì)象。Iteraor接口的優(yōu)點(diǎn):Iterator是用于遍歷集合類的標(biāo)準(zhǔn)訪問方法。每種集合類返回的Iterator對(duì)象類型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,但是它們都實(shí)現(xiàn)了Iterator接口,因此用戶不需直接和集合類打交道。六大接口之五——ListIterator接口ListIterator是Iterator的子接口。它對(duì)集合遍歷時(shí)進(jìn)行的更改,將直接影響原來的集合。對(duì)List來說,也可以通過listIterator()取得其迭代器。Iterator和ListIterator主要區(qū)別在以下方面:ListIterator和Iterator都有hasNext()和next()方法,可以實(shí)現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實(shí)現(xiàn)逆向(順序向前)遍歷。ListIterator有add()方法,可向List中添加對(duì)象。ListIterator可以定位當(dāng)前的索引位置,nextIndex()和previousIndex()可以實(shí)現(xiàn),Iterator沒有此功能。都可實(shí)現(xiàn)刪除對(duì)象,但是ListIterator可以實(shí)現(xiàn)對(duì)象的修改,此功能通過set()方法來實(shí)現(xiàn)。集合接口在使用時(shí)的注意事項(xiàng)Enumeration接口的nextElement方法和Iteraor接口的next()方法返回的對(duì)象用Object進(jìn)行引用,在實(shí)際使用中,應(yīng)根據(jù)對(duì)象的具體類型進(jìn)行顯式的轉(zhuǎn)化(注意,要轉(zhuǎn)化成X類,條件是集合中所引用的對(duì)象原來就是X類型,或是X類型的子類,否則會(huì)產(chǎn)生類型轉(zhuǎn)化異常)。一些集合對(duì)象,例如Hashtable、HashMap,它的鍵和其值的加入順序,與Iteraor遍歷順序,并不一定一致。六大接口之六——Comparator接口Comparator是一個(gè)集合對(duì)象排序接口,某個(gè)類實(shí)現(xiàn)了這個(gè)接口,那么這個(gè)類的對(duì)象就可以進(jìn)行排序,接口方法如下:

publicinterfaceComparator{

int

compare(Objecto1,Objecto2);

boolean

equals(Object

obj);}一般都只需要實(shí)現(xiàn)compare方法就行了,因?yàn)轭惗际悄J(rèn)從Object繼承,可使用Object的equals()方法。兩個(gè)特殊的集合類

StringTokenizer類StringTokenizer是以token為單元的字符串集合,它實(shí)現(xiàn)Enumeration接口,對(duì)其集合進(jìn)行遍歷采用Enumeration提供的方法,當(dāng)然也可采用它自己的方法,例如:

StringTokenizer

st=newStringTokenizer("thisisatest"); while(st.hasMoreTokens()){System.out.println(st.nextToken());}默認(rèn)情況下,StringTokenizer用空格、制表符“\t”、回車符、換行符、分頁符為標(biāo)志進(jìn)行token區(qū)分。其他的構(gòu)造方法:publicStringTokenizer(String

str,String

delim)publicStringTokenizer(String

str,String

delim,boole

溫馨提示

  • 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)論