Java集合框架總結(jié)_第1頁
Java集合框架總結(jié)_第2頁
Java集合框架總結(jié)_第3頁
Java集合框架總結(jié)_第4頁
Java集合框架總結(jié)_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第第頁Java集合框架總結(jié)Java的集合框架總結(jié)

JAVA集合框架

一、集合框架

在實際開發(fā)中,需要將對象依據(jù)不同的需求而存儲在特定的數(shù)據(jù)結(jié)構(gòu)容器中。但是數(shù)組雖然是一種用來存儲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),但是它的局限性很低,很難滿意各種的需求,所以JDK涌現(xiàn)了用來滿意各種需求的框架——集合框架。

“集合框架”主要由一組用來操作對象的接口組成。不同接口描述一組不同數(shù)據(jù)類型。常見的集合類有:1〕實現(xiàn)Collection接口的:List接口、Set接口。

2〕實現(xiàn)Map接口的。

二、Collection接口

Collection接口表示了如何把一組對象作為它的元素。JDK沒有徑直提供Collection接口的實現(xiàn),Collection接口的實現(xiàn)依靠于兩個繼承自自己的接口:Set和List。全部通過實現(xiàn)Collection接口的子接口的類應當提供兩個標準的構(gòu)造器:一個不需要參數(shù)的構(gòu)造器,用來創(chuàng)建一個空的集合,另外一個需要一個類型作為參數(shù)的構(gòu)造器,用來創(chuàng)建一個和參數(shù)的類型相同的元素的集合。

intsize():返回這個集合中的元素的數(shù)量。

booleanisEmpty():返回集合是否包含元素,假如沒有的話,返回true。booleancontains(Ee):假如這個集合包含某個指定的元素,返回true。

IteratorEiterator():返回這個集合中的全部元素的迭代。

booleanadd(Ee):向集合中添加新的元素,假如添加勝利,返回true。

booleanremove(Ee):從集合中刪除指定元素,假如刪除勝利,返回true。

booleancontainsAll(Collection?c):這個集合是否包含指定集合中的全部的元素。booleanaddAll(Collection?e*tendsEc):添加指定的集合中的全部元素到這個集合中。

booleanremoveAll(Collection?c):刪除當前集合中與給定集合相同的元素。在這個調(diào)用返回之后,這個集合將不包含和指定的集合一樣的元素。

booleanretainAll(Collection?c):從這個集合中刪除全部不包含在指定的集合中的全部元素。

TT[]toArray(T[]a):返回一個包含集合中全部的元素的數(shù)組。

voidclear():從集合中刪除全部的元素。

booleanequals(Objectobj):比較這個集合和指定對象是否相等。

inthashCode():返回這個集合的哈希值。

三、List接口

List接口繼承了Collection接口,用于定義一個允許重復項的有序集合。可以將List理解為存放對象的數(shù)組,只不過其元素個數(shù)可以動態(tài)的增加或者減削。該接口不但能夠?qū)α斜淼囊徊糠诌M行處理,還添加了面對位置的操作。

面對位置的操作包括插入某個元素或Collection的功能,還包括獵取、除去或更改元素的功能。在List中搜尋元素可以從列表的頭部或尾部開始,假如找到元素,還將報告元素所在的位置:

voidadd(intinde*,Objectelement):在指定位置inde*上添加元素element。

booleanaddAll(intinde*,Collectionc):將集合c的全部元素添加到指定位置inde*。Objectget(intinde*):返回List中指定位置的元素。

intinde*Of(Objecto):返回第一個涌現(xiàn)元素o的位置,否那么返回-1。

intlastInde*Of(Objecto):返回最末一個涌現(xiàn)元素o的位置,否那么返回-1。

Objectremove(intinde*):刪除指定位置上的元素。

Java的集合框架總結(jié)

Objectset(intinde*,Objectelement):用元素element取代位置inde*上的元素,并且返回舊的元素。

在“集合框架”中有兩種常規(guī)的List實現(xiàn)ArrayList和LinkedList,分別用動態(tài)數(shù)組和鏈表的方式實現(xiàn)List接口??梢哉J為ArrayList和LinkedList的方法在規(guī)律上完全一樣,只是在性能上有肯定的差別。假如要支持隨機訪問,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList提供了可選的集合。但假如,您要經(jīng)常的從列表的中間位置添加和除去元素,而只要順次的訪問列表元素,那么,LinkedList實現(xiàn)更好。

1〕LinkedList類

LinkedList類——鏈表實現(xiàn)的List,在刪除或插入時只需轉(zhuǎn)變鏈表“指針”,即可實現(xiàn)。

(1)voidaddFirst(Objecto):將對象o添加到列表的開頭

voidaddLast(Objecto):將對象o添加到列表的結(jié)尾

(2)ObjectgetFirst():返回列表開頭的元素

ObjectgetLast():返回列表結(jié)尾的元素

(3)ObjectremoveFirst():刪除并且返回列表開頭的元素

ObjectremoveLast():刪除并且返回列表結(jié)尾的元素

(4)LinkedList():構(gòu)建一個空的鏈接列表

LinkedList(Collectionc):構(gòu)建一個鏈接列表,并且添加集合c的全部元素

“運用這些新方法,您就可以輕松的把LinkedList當作一個堆棧、隊列或其它面對端點的數(shù)據(jù)結(jié)構(gòu)?!?/p>

2〕ArrayList類

ArrayList類——動態(tài)數(shù)組實現(xiàn)的List,可以通過下標快速的索引到對應的元素,但在刪除和移動時移動較多元素。

ArrayList類封裝了一個動態(tài)再安排的Object[]數(shù)組。每個ArrayList對象有一個capacity。這個capacity表示存儲列表中元素的數(shù)組的容量。當元素添加到ArrayList時,它的capacity在常量時間內(nèi)自動增加。

在向一個ArrayList對象添加大量元素的程序中,可運用ensureCapacity方法增加capacity。這可以減削增加重安排的數(shù)量。

(1)voidensureCapacity(intminCapacity):將ArrayList對象容量增加minCapacity

(2)voidtrimToSize():整理ArrayList對象容量為列表當前大小。程序可運用這個操作減削ArrayList對象存儲空間。

四、List高級—數(shù)據(jù)結(jié)構(gòu):Queue隊列

隊列是常用的數(shù)據(jù)結(jié)構(gòu),可以將〔Queue〕隊列看成非常的線性表,隊列限制了對線性表的訪問方式,即只能從線性表的一段添加〔offer〕元素,從另一端取出〔poll〕元素。隊列遵循先進先出〔FIFO〕原那么。

JDK中提供了Queue接口,同時使得LinkedList實現(xiàn)該接口〔Queue常常要進行插入和刪除的操作,而LinkedList在這方面效率最高〕。

Queue接口中的主要方法:

Booleanoffer〔Ee〕講一個對象添加到隊尾,添加勝利那么返回true。

Epool〔〕從隊首刪除并返回一個元素。

Epeek〔)返回隊首的元素〔但并不刪除〕。

五、List高級—數(shù)據(jù)結(jié)構(gòu):Deque棧

棧也是常用的數(shù)據(jù)結(jié)構(gòu),?!睤eque〕那么是Queue的子接口,定義了所謂的“雙端隊列”,即從隊列的兩端分別可以入隊〔offer〕和出隊〔poll〕,假如將Deque限制為只能從一段入隊

Java的集合框架總結(jié)

和出隊,那么可實現(xiàn)“棧〔Stack〕”的數(shù)據(jù)結(jié)構(gòu),對于棧而言,入棧稱之為push,出棧稱為pop。棧遵循先進后出〔FILO〕原那么。

Deque常用的方法:

Epush〔〕壓入,向棧中存入數(shù)據(jù)。

Epop〔〕取出,從棧中取出數(shù)據(jù)。

Epeek〔〕獵取棧頂位置的元素,但不取出。

六、Set接口

Set接口也是Collection接口的子接口,但是與Collection或List接口不同的是,Set接口中不能加入重復的元素,是由于Set判斷兩個對象相同不是運用==運算符,而是依據(jù)equals方法。即兩個對象用equals方法比較返回true,Set就不能接受兩個對象。同時Set集合里多個對象之間沒有明顯的順次。

其實Set具有與Collection完全一樣的接口,除了說明不一樣其他都一樣,也就是Set根本沒有對Collection擴展,只是對add,equals,hashCode的定義說明不一樣,由于Set是不允許重復元素的。但是要留意的是:雖然Set和Collection中的方法一樣,但是他們是完全不一樣的,List可以自動為Collection,但是絕對不能轉(zhuǎn)為Set的。

遍歷Set集合的元素只有一種方式,迭代器。同時set集合不支持索引,也不具備List集合的get〔〕方法。

Set接口的常用子類:

1〕散列的存放:HashSet

HashSet按Hash算法來存儲集合的元素,因此具有很好的存取和查找性能。HashSet的特點:

〔1〕HashSet不是同步的,多個線程訪問是需要通過代碼保證同步

〔2〕集合元素值可以使null。

HashSet集合判斷兩個元素相等的標準是兩個對象通過equals方法比較相等,并且兩個對象的hashCode〔〕方法返回值也相等。

其實原理是這樣的:HashSet的底層采納HashMap來存放數(shù)據(jù),HashMap的put()方法是這樣的:

publicVput(Kkey,Vvalue){

if(key==null)

returnputForNullKey(value);

inthash=hash(key.hashCode());//1

inti=inde*For(hash,table.length);//2

for(EntryK,Ve=table[i];e!=null;e=e.ne*t){//3

Objectk;

if(e.hash==hash((k=e.key)==key||key.equals(k))){

VoldValue=e.value;

e.value=value;

e.recordAccess(this);

returnoldValue;

}

}//4

modCount++;

addEntry(hash,key,value,i);

Java的集合框架總結(jié)

returnnull;

}

當向HashMap中添加元素的時候,首先計算元素的hashcode值,然后依據(jù)1處的代碼計算出Hashcode的值,再依據(jù)2處的代碼計算出這個元的存儲位置假如這個位置為空,就將元素添加進去;假如不為空,那么看3-4的代碼,遍歷索引為i的鏈上的元素,假如key重復,那么替換并返回oldValue值。

2〕有序的存放:TreeSet

TreeSet是SortedSet接口的唯一實現(xiàn),是按排序二叉樹算法來存儲元素的,TreeSet可以確保集合元素處于排序狀態(tài)〔元素是有序的〕。

七、Map

→Map用于保存具有映射關(guān)系的數(shù)據(jù)〔key-vlaue〕。Map的key不允許重復,即同一個Map對象的任何兩個key通過equals方法比較總是返回false。

→Map集合與Set集合元素的存儲形式很像,如Set接口下有HashSet、LinkedHashSet、SortedSet〔接口〕、TreeSet、EnumSet等實現(xiàn)類和子接口,而Map接口下那么有HashMap、LinkedHashMap、SortedMap〔接口〕、TreeMap、EnumMap等實現(xiàn)類和子接口?!鶰ap的value特別類似List:元素與元素之間可以重復,每個元素可以依據(jù)索引〔key〕來查找。

→Map有時也稱為字典,或關(guān)聯(lián)數(shù)組。

→Map接口中定義如下方法:

voidclear();刪除Map對象中全部key-value對。

booleancontainsKey(Objectkey):查詢Map中是否包含指定key,假如包含那么返回true。

booleancontainsValue(Objectvalue):查詢Map中是否包含一個或多個value,假如包含那么返回true。

SetentrySet():返回Map中全部包含的key-value對組成的Set集合,每個集合元素都是Map.Entry(Entry是Map的內(nèi)部類〕對象。

Objectget(Obejctkey):返回指定key所對應的value;假如此Map中不包含key,那么返回null。

booleanisEmpty():查詢該Map是否為空〔即不包含任何key-value對〕,假如為空那么返回true。

SetkeySet():返回該Map中全部key所組成的set集合。

Objectput(Objectkey,Objectvalue):添加一個key-value對,假如當前Map中已有一個與該key相等的key-value對,那么新的key-value對會掩蓋原來的key-value對。Objectremove(Objectkey):刪除指定key對應的key-value對,返回被刪除key所關(guān)聯(lián)的value,假如該key不存在,返回null。

intsize():返回該Map里的key-value對的個數(shù)。

Collectionvalues():返回該Map里全部value組成的Collection。

Map中包括一個內(nèi)部類:Entry。該類封裝了一個key-value對,Entry包含三個方法:Objectgetkey():返回該Entry里包含的key值。

ObjectgetValue():返回該Entry里包含的value值。

ObjectsetValue():設置該Entry里包含的value值,并返回新設置的value值?!梢园袽ap理解成一個非常的Set,只是該Set里包含的集合元素是Entry對象,而不是一般對象。

→遍歷Map有三種方式:

Java的集合框架總結(jié)

1、遍歷map中的全部key

publicSetkeySet()調(diào)用keySet〔〕方法會返回一個Set集合的實例,其中保留的元素為Map中全部的Key。

2、遍歷Map中全部的鍵值對Entry

publicSetentrySet()調(diào)用entrySet〔〕方法會返回一個Set集合的實例,其中保存的元素為Map中的每一組鍵值對,每一個鍵值對用一個Entry實例保存。

3、遍歷Map中全部的value(不常用)。

→Map接口提供了大量的實現(xiàn)類,如HashMap和Hashtable等,以及HashMap的子類,LinkedHashMap,還有SortedMap子接口及該接口的實現(xiàn)類TreeMap。

1〕、HashMap和Hashtable實現(xiàn)類

HashMap和Hashtable都是Map接口的實現(xiàn)類,Hashtable是一個古老的Map實現(xiàn)類,它從JDK1.0起就有,它包含兩個煩瑣的方法:elements()(類似于Map接口定義的values()方法〕和keys()〔類似于Map接口定義的keySet()方法),現(xiàn)在很少運用這兩種方法。兩點區(qū)分:

Hashtable是一個線程安全的Map實現(xiàn),但HashMap是線程擔心全的實現(xiàn),所以HashMap比Hashtable的性能高些;但假如多線程訪問同一個Map對象,運用Hashtable實現(xiàn)類更好。Hashtable不允許運用null作為key和value,假如為null,那么引發(fā)NullPointerE*ception異樣;但HashMap可以運用null作為key或value。

由于HashMap里的可以不能重復,所以HashMap里最多只有一對key-value值為null,但可以有很多多項key-value對的value為null。

HashMap重寫了toString()方法方法總是返回如下格式的字符串:{key1=value1,key2=value2..}

HashMap、Hashtable判斷兩個key相等的標準是:兩個key通過equasl方法比較返回ture,兩個key的hashCode值相等。

LinkedHashMap類

HashMap有一個子類:LinkedHashMap,它也是雙向鏈表來維護key-value對的次序,該鏈表定義了迭代順次,該迭代順次與key-value對的插入順次保持全都。

LinkedHashMap可以避開對HashMap、Hashtable里的key-value對進行排序〔只要插入key-value對時保持順次即可〕。同時又可避開運用TreeMap所增加的成本。

LinkedHashMap需要維護元素的插入順次,因此性能略低于HashMap的性能,但在迭代訪問Map里的全部元素時將有很好的性能,由于它以鏈表來維護內(nèi)部順次。

2〕、SortedMap接口和TreeMap實現(xiàn)類

Map接口派生了一個SortedMap子接口,TreeMap為其實現(xiàn)類。類似TreeSet排序,TreeMap也是基于紅黑樹對TreeMap中全部key進行排序,從而保證TreeMap中全部key-value對處于有序狀態(tài)。

TreeMap兩種排序方法:

自然排序:TreeMap的全部key需要實現(xiàn)Comparable接口,而且全部key應當是同一個類的對象,否那么將會拋出ClassCastE*cepiton異樣。

定制排序:創(chuàng)建TreeMap時,傳入一個Comparator對象,該對象負責對TreeMap中全部key進行排序。采納定制排序時不要求Map的key實現(xiàn)Comparable接口。

TreeMap中判斷兩個key相等的標準也是兩個key通過equals比較返回true,而通過compareTo方法返回0,TreeMap即認為這兩個key是相等的。

八、小結(jié)

List:保證以某種特定插入順次來維護元素順次,即保持插入的順次,另外元素可以重復。

Java的集合框架總結(jié)

ArrayList:是用數(shù)組實現(xiàn)的,讀取速度快,插入與刪除速度慢〔由于插入與刪除時要移動后面的元素〕,適合于隨機訪問。

Vector:功能與ArrayList幾乎相同,也是以數(shù)組實現(xiàn),添加,刪除,讀取,設置都是基于線程同步的。

LinkedList:雙向鏈表來實現(xiàn),刪除與插入速度快,讀取速度較慢,由于它讀取時是從頭向尾〔假如節(jié)點在鏈的前半部分〕,或尾向頭〔假如節(jié)點在鏈的后半部分〕查找元素。因此適合于元素的插入與刪除操作。

Set:維持它自己的內(nèi)部排序,隨機訪問不具有意義。另外元素不可重復,內(nèi)部是以Map實現(xiàn)的。

HashSet:是最常用的,查詢速度最快,由于內(nèi)部以HashMap來實現(xiàn),所以插入元素不能保持插入次序。

LinkedHashSet:繼承了HashSet,保持元素的插入次序,由于內(nèi)部運用LinkedHashMap實現(xiàn),所以能保持元素插入次序。

TreeSet:基于TreeMap,生成一個總是處于排序狀態(tài)的set,它實現(xiàn)了SortedSet接口,內(nèi)部以TreeMap來實現(xiàn)。

Map:用于保存具有映射關(guān)系的數(shù)據(jù)〔key-vlaue〕,Key不允許重復。

TreeMap:鍵以某種排序規(guī)章排序,內(nèi)部以red-black〔紅-黑〕樹數(shù)據(jù)結(jié)構(gòu)實現(xiàn),實現(xiàn)了SortedMap接口。

HashMap:以哈希表數(shù)據(jù)結(jié)構(gòu)實現(xiàn),查找對象時通過哈希函數(shù)計算其位置,它是為快速查詢而設計的,其內(nèi)部定義了一個hash表數(shù)組〔Entry[]table〕,元素會通過哈希轉(zhuǎn)換函數(shù)將元素的哈希地址轉(zhuǎn)換成數(shù)組中存放的索引,假如有沖突,那么運用散列鏈表的形式將全部相同哈希地址的元素串起來。

Hashtable:也是以哈希表數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,解決沖突時與HashMap也一樣也是采納了散列鏈表的形式,不過性能比HashMap要低。

九、比較

1、ArrayList和Vector

同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序擔心全的,不是同步的。

數(shù)據(jù)增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半

2、Collection和Collections

Collection,java.unit下的接口,是一系列單值集合類的父接口,主要有List和Set,提供了基本的一些方法。而Collections是java.unit下的類,是針對集合的一些援助類,是一系列算法的集合。里面的屬性和方法基本都是static的,來實現(xiàn)對各種集合的搜尋、排序、線程安全化等操作。

3、Iterator與ListIterator有什么區(qū)分?

Iterator:只能正向遍歷集合,適用于獵取移除元素。ListIerator:繼承Iterator,可以雙向列表的遍歷,同樣支持元素的修改。

4、heap和stack有什么區(qū)分。

?!瞫tack〕是一種線形集合,其添加和刪除元素的操作應在同一段完成。棧根據(jù)后進先出的方式進行處理。

堆〔heap〕是棧的一個組成元素。

十、總結(jié)

Java的集合框架總結(jié)

關(guān)于集合框架的只是很雜,很亂。我也只是依據(jù)咱們的學習總結(jié)了一些咱們常常需要用到和面試會常??嫉降闹R點。我盼望每一個同學都能抽出那么幾分鐘看一看這個,來讓我們的大腦再加深一下關(guān)于集合的印象。本文我沒有運用代碼進行演示,望大家諒解,感謝您的參考!

Java的集合框架總結(jié)

JAVA集合框架

一、集合框架

在實際開發(fā)中,需要將對象依據(jù)不同的需求而存儲在特定的數(shù)據(jù)結(jié)構(gòu)容器中。但是數(shù)組雖然是一種用來存儲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),但是它的局限性很低,很難滿意各種的需求,所以JDK涌現(xiàn)了用來滿意各種需求的框架——集合框架。

“集合框架”主要由一組用來操作對象的接口組成。不同接口描述一組不同數(shù)據(jù)類型。常見的集合類有:1〕實現(xiàn)Collection接口的:List接口、Set接口。

2〕實現(xiàn)Map接口的。

二、Collection接口

Collection接口表示了如何把一組對象作為它的元素。JDK沒有徑直提供Collection接口的實現(xiàn),Collection接口的實現(xiàn)依靠于兩個繼承自自己的接口:Set和List。全部通過實現(xiàn)Collection接口的子接口的類應當提供兩個標準的構(gòu)造器:一個不需要參數(shù)的構(gòu)造器,用來創(chuàng)建一個空的集合,另外一個需要一個類型作為參數(shù)的構(gòu)造器,用來創(chuàng)建一個和參數(shù)的類型相同的元素的集合。

intsize():返回這個集合中的元素的數(shù)量。

booleanisEmpty():返回集合是否包含元素,假如沒有的話,返回true。booleancontains(Ee):假如這個

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論