面試中常問的Java集合問題_第1頁
面試中常問的Java集合問題_第2頁
面試中常問的Java集合問題_第3頁
面試中常問的Java集合問題_第4頁
面試中常問的Java集合問題_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Java集合框架匯總(個(gè)人整理)1.集合框架結(jié)構(gòu)圖 12.兩種特殊的Java容器類List和Set分析 23.Collection接口: 24.Iterator接口: 35.List接口: 35.1LinkedList類: 55.2ArrayList類: 56.Set接口: 57.Map接口: 68.Comparable接口和Comparator接口: 79.集合框架面試題 71.集合框架結(jié)構(gòu)圖Collection(Collection(接口)Map(接口)List(接口)HashTableHashMapTreeMapLinkedListArrayListVertorTreeSetHashSetSet(接口)List(接口)HashTableHashMapTreeMapLinkedListArrayListVertorTreeSetHashSetSet(接口)集合接口說明:Collection接口是一組允許重復(fù)的對象。List接口繼承Collection,允許重復(fù),以元素安插的次序來放置元素,不會重新排列。Set接口繼承Collection,但不允許重復(fù),使用自己內(nèi)部的一個(gè)排列機(jī)制。Map接口是一組成對的鍵-值對象,即所持有的是key-valuepairs。Map中不能有重復(fù)的key。擁有自己的內(nèi)部排列機(jī)制。容器中的元素類型都為Object。從容器取得元素時(shí),必須把它轉(zhuǎn)換成原來的類型。2.兩種特殊的Java容器類List和Set分析 容器類可以大大提高編程效率和編程能力,在Java2中,所有的容器都由SUN公司的JoshuaBloch進(jìn)行了重新設(shè)計(jì),豐富了容器類庫的功能。Java2容器類類庫的用途是“保存對象”,它分為兩類:Collection||List(可以重復(fù))|Set(不能重復(fù))Map(鍵值對)Collection一組獨(dú)立的元素,通常這些元素都服從某種規(guī)則。List必須保持元素特定的順序,而Set不能有重復(fù)元素。Map一組成對的“鍵值對”對象,即其元素是成對的對象,最典型的應(yīng)用就是數(shù)據(jù)字典,并且還有其它廣泛的應(yīng)用。另外,Map可以返回其所有鍵組成的Set和其所有值組成的Collection,或其鍵值對組成的Set,并且還可以像數(shù)組一樣擴(kuò)展多維Map,只要讓Map中鍵值對的每個(gè)“值”是一個(gè)Map即可。3.Collection接口:用于表示任何對象或元素組。想要盡可能以常規(guī)方式處理一組元素時(shí),就使用這一接口。(1)單元素添加、刪除操作:booleanadd(Objecto):將對象添加給集合booleanremove(Objecto):如果集合中有與o相匹配的對象,則刪除對象o(2)查詢操作:intsize():返回當(dāng)前集合中元素的數(shù)量booleanisEmpty():判斷集合中是否有任何元素booleancontains(Objecto):查找集合中是否含有對象oIteratoriterator():返回一個(gè)迭代器,用來訪問集合中的各個(gè)元素(3)組操作:作用于元素組或整個(gè)集合booleancontainsAll(Collectionc):查找集合中是否含有集合c中所有元素booleanaddAll(Collectionc):將集合c中所有元素添加給該集合voidclear():刪除集合中所有元素voidremoveAll(Collectionc):從集合中刪除集合c中的所有元素voidretainAll(Collectionc):從集合中刪除集合c中不包含的元素(4)Collection轉(zhuǎn)換為Object數(shù)組:Object[]toArray():返回一個(gè)內(nèi)含集合所有元素的arrayObject[]toArray(Object[]a):返回一個(gè)內(nèi)含集合所有元素的array。運(yùn)行期返回的array和參數(shù)a的型別相同,需要轉(zhuǎn)換為正確型別。此外,您還可以把集合轉(zhuǎn)換成其它任何其它的對象數(shù)組。但是,您不能直接把集合轉(zhuǎn)換成基本數(shù)據(jù)類型的數(shù)組,因?yàn)榧媳仨毘钟袑ο?。Collection不提供get()方法。如果要遍歷Collectin中的元素,就必須用Iterator4.Iterator接口:Collection接口的iterator()方法返回一個(gè)Iterator。Iterator接口方法能以迭代方式逐個(gè)訪問集合中各個(gè)元素,并安全的從Collection中除去適當(dāng)?shù)脑亍5魇且环N設(shè)計(jì)模式,它是一個(gè)對象,它可以遍歷并選擇序列中的對象,而開發(fā)人員不需要了解該序列的底層結(jié)構(gòu)。迭代器通常被稱為“輕量級”對象,因?yàn)閯?chuàng)建它的代價(jià)小。Java中的Iterator功能比較簡單,并且只能單向移動:(1)使用方法iterator()要求容器返回一個(gè)Iterator。第一次調(diào)用Iterator的next()方法時(shí),它返回序列的第一個(gè)元素。(2)使用next()獲得序列中的下一個(gè)元素。(3)使用hasNext()檢查序列中是否還有元素。(4)使用remove()將迭代器新返回的元素刪除。Iterator是Java迭代器最簡單的實(shí)現(xiàn),為List設(shè)計(jì)的ListIterator具有更多的功能,它可以從兩個(gè)方向遍歷List,也可以從List中插入和刪除元素。“Iterator中刪除操作對底層Collection也有影響?!钡魇枪收峡焖傩迯?fù)(fail-fast)的。這意味著,當(dāng)另一個(gè)線程修改底層集合的時(shí)候,如果您正在用Iterator遍歷集合,那么,Iterator就會拋出ConcurrentModificationException(另一種RuntimeException異常)異常并立刻失敗5.List接口:List接口繼承了Collection接口以定義一個(gè)允許重復(fù)項(xiàng)的有序集合。該接口不但能夠?qū)α斜淼囊徊糠诌M(jìn)行處理,還添加了面向位置的操作。List接口將以特定次序存儲元素。所以取出來的順序可能和放入順序不同。實(shí)現(xiàn)list的類有ArrayList,LinkedList,和Vector等。List(interface):次序是List最重要的特點(diǎn);它確保維護(hù)元素特定的順序。List為Collection添加了許多方法,使得能夠向List中間插入與移除元素(只推薦LinkedList使用)。一個(gè)List可以生成ListIterator,使用它可以從兩個(gè)方向遍歷List,也可以從List中間插入和刪除元素。ArrayList:由數(shù)組實(shí)現(xiàn)的List。它允許對元素進(jìn)行快速隨機(jī)訪問,但是向List中間插入與移除元素的速度很慢。ListIterator只應(yīng)該用來由后向前遍歷ArrayList,而不是用來插入和刪除元素,因?yàn)檫@比LinkedList開銷要大很多。LinkedList:對順序訪問進(jìn)行了優(yōu)化,向List中間插入與刪除得開銷不大,隨機(jī)訪問則相對較慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),這些方法(沒有在任何接口或基類中定義過)使得LinkedList可以當(dāng)作堆棧、隊(duì)列和雙向隊(duì)列使用。(1)面向位置的操作包括插入某個(gè)元素或Collection的功能,還包括獲取、除去或更改元素的功能。在List中搜索元素可以從列表的頭部或尾部開始,如果找到元素,還將報(bào)告元素所在的位置:voidadd(intindex,Objectelement):在指定位置index上添加元素elementbooleanaddAll(intindex,Collectionc):將集合c的所有元素添加到指定位置indexObjectget(intindex):返回List中指定位置的元素intindexOf(Objecto):返回第一個(gè)出現(xiàn)元素o的位置,否則返回-1intlastIndexOf(Objecto):返回最后一個(gè)出現(xiàn)元素o的位置,否則返回-1Objectremove(intindex):刪除指定位置上的元素Objectset(intindex,Objectelement):用元素element取代位置index上的元素,并且返回舊的元素(2)List接口不但以位置序列迭代的遍歷整個(gè)列表,還能處理集合的子集:ListIteratorlistIterator():返回一個(gè)列表迭代器,用來訪問列表中的元素ListIteratorlistIterator(intindex):返回一個(gè)列表迭代器,用來從指定位置index開始訪問列表中的元素ListsubList(intfromIndex,inttoIndex):返回從指定位置fromIndex(包含)到toIndex(不包含)范圍中各個(gè)元素的列表視圖在“集合框架”中有兩種常規(guī)的List實(shí)現(xiàn):ArrayList和LinkedList。使用兩種List實(shí)的哪一種取決于您特定的需要。如果要支持隨機(jī)訪問,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList提供了可選的集合。但如果,您要頻繁的從列表的中間位置添加和除去元素,而只要順序的訪問列表元素,那么,LinkedList實(shí)現(xiàn)更好?!癆rrayList和LinkedList都實(shí)現(xiàn)Cloneable接口,都提供了兩個(gè)構(gòu)造函數(shù),一個(gè)無參的,一個(gè)接受另一個(gè)Collection”5.1LinkedList類:LinkedList添加了一些處理列表兩端元素的方法。(1)voidaddFirst(Objecto):將對象o添加到列表的開頭voidaddLast(Objecto):將對象o添加到列表的結(jié)尾(2)ObjectgetFirst():返回列表開頭的元素ObjectgetLast():返回列表結(jié)尾的元素(3)ObjectremoveFirst():刪除并且返回列表開頭的元素ObjectremoveLast():刪除并且返回列表結(jié)尾的元素(4)LinkedList():構(gòu)建一個(gè)空的鏈接列表LinkedList(Collectionc):構(gòu)建一個(gè)鏈接列表,并且添加集合c的所有元素5.2ArrayList類:ArrayList封裝了一個(gè)動態(tài)再分配的Object[]數(shù)組。每個(gè)ArrayList對象有一個(gè)capacity。個(gè)capacity表示存儲列表中元素的數(shù)組的容量。當(dāng)元素添加到ArrayList時(shí),它的capacity在常量時(shí)間內(nèi)自動增加。在向一個(gè)ArrayList對象添加大量元素的程序中,可使用ensureCapacity方法增加capacity。這可以減少增加重分配的數(shù)量。(1)voidensureCapacity(intminCapacity):將ArrayList對象容量增加minCapacity(2)voidtrimToSize():整理ArrayList對象容量為列表當(dāng)前大小。使用這個(gè)操作減少ArrayList對象存儲空間。6.Set接口:Set接口繼承Collection接口,而且它不允許集合中存在重復(fù)項(xiàng),每個(gè)具體的Set實(shí)現(xiàn)類依賴添加的對象的equals()方法來檢查獨(dú)一性。Set接口沒有引入新方法,所以Set就是一個(gè)Collection,只不過其行為不同。 Set接口也是Collection的一種擴(kuò)展,而與List不同的時(shí),在Set中的對象元素不能重復(fù),也就是說你不能把同樣的東西兩次放入同一個(gè)Set容器中。它的常用具體實(shí)現(xiàn)有HashSet和TreeSet類。 HashSet擴(kuò)展AbstractSet并且實(shí)現(xiàn)Set接口。它創(chuàng)建一個(gè)類集,該類集使用散列表進(jìn)行存儲。散列表通過使用稱之為散列法的機(jī)制來存儲信息。散列法的優(yōu)點(diǎn)在于即使對于大的集合,它允許一些基本操作如add(),contains(),remove()和size()方法的運(yùn)行時(shí)間保持不變。散列集合并沒有確保其元素的順序,因?yàn)樯⒘蟹ǖ奶幚硗ǔ2蛔屪约簠⑴c創(chuàng)建排序集合。如果需要排序存儲,另一種類集--TreeSet將是一個(gè)更好的選擇。 TreeSet為使用樹來進(jìn)行存儲的Set接口提供了一個(gè)工具,對象按升序存儲。訪問和檢索是很快的。在存儲了大量的需要進(jìn)行快速檢索的排序信息的情況下,TreeSet是一個(gè)很好的選擇。 HashSet和TreeSet的比較:在各種Sets中,HashSet通常優(yōu)于HashTree(插入、查找)。只有當(dāng)需要產(chǎn)生一個(gè)經(jīng)過排序的序列,才用TreeSet??偨Y(jié):Set(interface):存入Set的每個(gè)元素必須是唯一的,因?yàn)镾et不保存重復(fù)元素。加入Set的Object必須定義equals()方法以確保對象的唯一性。Set與Collection有完全一樣的接口。Set接口不保證維護(hù)元素的次序。HashSet:為快速查找而設(shè)計(jì)的Set。存入HashSet的對象必須定義hashCode()。TreeSet:保持次序的Set,底層為樹結(jié)構(gòu)。使用它可以從Set中提取有序的序列。LinkedHashSet:具有HashSet的查詢速度,且內(nèi)部使用鏈表維護(hù)元素的順序(插入的次序)。于是在使用迭代器遍歷Set時(shí),結(jié)果會按元素插入的次序顯示。HashSet采用散列函數(shù)對元素進(jìn)行排序,這是專門為快速查詢而設(shè)計(jì)的;TreeSet采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)進(jìn)行排序元素;LinkedHashSet內(nèi)部使用散列以加快查詢速度,同時(shí)使用鏈表維護(hù)元素的次序,使得看起來元素是以插入的順序保存的。需要注意的是,生成自己的類時(shí),Set需要維護(hù)元素的存儲順序,因此要實(shí)現(xiàn)Comparable接口并定義compareTo()方法。7.Map接口:Map接口用于維護(hù)鍵/值對(key/valuepairs)。該接口描述了從不重復(fù)的鍵到值的映射。Map接口常用的實(shí)現(xiàn)類有:HashMap和TreeMap。 HashMap類使用散列表實(shí)現(xiàn)Map接口。散列映射并不保證它的元素的順序。因此,元素加入散列映射的順序并不一定是它們被迭代函數(shù)讀出的順序。 TreeMap類通過使用樹實(shí)現(xiàn)Map接口。TreeMap提供了按排序順序存儲關(guān)鍵字/值對的有效手段,同時(shí)允許快速檢索。應(yīng)該注意的是,不像散列映射,樹映射保證它的元素按照關(guān)鍵字升序排序。 說明:Map用put(k,v)/get(k),還可以使用containsKey()/containsValue()來檢查其中是否含有某個(gè)key/value。 HashMap用于快速查找。在Map接口中,HashMap用的比較多,如果需要對集合中的元素進(jìn)行排序,才可以用TreeMap,不需要排序就用HashMap。(1)添加、刪除操作:Objectput(Objectkey,Objectvalue):將互相關(guān)聯(lián)的一個(gè)關(guān)鍵字與一個(gè)值放入該映像。如果該關(guān)鍵字已經(jīng)存在,那么與此關(guān)字相關(guān)的新值將取代舊值。方法返回關(guān)鍵字的舊值,如果關(guān)鍵字原先并不存在,則返回nullObjectremove(Objectkey):從映像中刪除與key相關(guān)的映射voidputAll(Mapt):將來自特定映像的所有元素添加給該映像voidclear():從映像中刪除所有映射“鍵和值都可以為null。但是,您不能把Map作為一個(gè)鍵或值添加給自身。”(2)查詢操作:Objectget(Objectkey):得與關(guān)鍵字key相關(guān)的值,并且返回與關(guān)鍵字key相關(guān)的對象,如果沒有在該映像中找到該關(guān)鍵字,則返回nullbooleancontainsKey(Objectkey):判斷映像中是否存在關(guān)鍵字keybooleancontainsValue(Objectvalue):判斷映像中是否存在值valueintsize():返回當(dāng)前映像中映射的數(shù)量booleanisEmpty():判斷映像中是否有任何映射(3)視圖操作:處理映像中鍵/值對組SetkeySet():返回映像中所有關(guān)鍵字的視圖集Collectionvalues():返回映像中所有值的視圖集SetentrySet():返回Map.Entry對象的視圖集,即映像中的關(guān)鍵字/值對8.Comparable接口和Comparator接口:在“集合框架”中有兩種比較接口:Comparable接口和Comparator接口。像String和Integer等Java內(nèi)建類實(shí)現(xiàn)Comparable接口以提供一定排序方式,但這樣只能實(shí)現(xiàn)該接口一次。對于那些沒有實(shí)現(xiàn)Comparable接口的類、或者自定義的類,您可以通過Comparator接口來定義您自己的比較方式。

Comparable接口

在java.lang包中,Comparable接口適用于一個(gè)類有自然順序的時(shí)候。假定對象集合是同一類型,該接口允許您把集合排序成自然順序。intcompareTo(Objecto):比較當(dāng)前實(shí)例對象與對象o,如果位于對象o之前,返回負(fù)值,如果兩個(gè)對象在排序中位置相同,則返回0,如果位于對象o后面,則返回正值Comparator接口若一個(gè)類不能用于實(shí)現(xiàn)java.lang.Comparable,或者您不喜歡缺省的Comparable行為并想提供自己的排序順序(可能多種排序方式),你可以實(shí)現(xiàn)Comparator接口,從而定義一個(gè)比較器。intcompare(Objecto1,Objecto2):對兩個(gè)對象o1和o2進(jìn)行比較,如果o1位于o2的前面,則返回負(fù)值,如果在排序順序中認(rèn)為o1和o2是相同的,返回0,如果o1位于o2的后面,則返回正值booleanequals(Objectobj):指示對象obj是否和比較器相等“與Comparable相似,0返回值不表示元素相等。一個(gè)0返回值只是表示兩個(gè)對象排在同一位置。由Comparator用戶決定如何處理。如果兩個(gè)不相等的元素比較的結(jié)果為零,您首先應(yīng)該確信那就是您要的結(jié)果,然后記錄行為。” 9.集合框架面試題1.Collection和Collections的區(qū)別。Collections是個(gè)java.util下的類,它包含有各種有關(guān)集合操作的靜態(tài)方法。

Collection是個(gè)java.util下的接口,它是各種集合結(jié)構(gòu)的父接口2.List,Set,Map是否繼承自Collection接口?List,Set是

Map不是

3.ArrayList和Vector的區(qū)別。

一.同步性:Vector的大多數(shù)方法具有同步能力,所以Vector是線程安全的,也就是說Vector是同步的。除了兩個(gè)只用于串行化的方法,沒有一個(gè)ArrayList的方法具有同步執(zhí)行的能力。所以ArrayList不是線程安全的,不是同步的

。二.執(zhí)行效率:因?yàn)閂ector是同步的,而ArrayList不是同步的。所以ArrayList的執(zhí)行效率要比Vector高。三.數(shù)據(jù)增長:Vector和ArrayList都支持可隨需要而增長的動態(tài)數(shù)組。能夠動態(tài)的增加或減少其大小。當(dāng)需要增長時(shí),Vector默認(rèn)增長為原來一培,而ArrayList卻是原來的一半

。四.如果使用中沒有特別規(guī)定要使用同步,就應(yīng)該選中ArrayList。選用ArrayList比選用Vertor具有更快的速度和更高的性能。4.為什么ArrayList可以代替Vector?可以使用Collections中提供的同步方法將ArrayList轉(zhuǎn)換為同步的Collections.synchronizedList(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論