詳細(xì)介紹java中的集合框架
集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。任何集合框架都包含三大塊內(nèi)容:對(duì)外的接口、接口的實(shí)現(xiàn)和對(duì)集合運(yùn)算的算法。
java集合框架:
1. 什么是框架:類庫(kù)的集合
2.集合框架:用來(lái)表示和操作的統(tǒng)一的架構(gòu),包含了實(shí)現(xiàn)集合的接口與類
3.集合:存放數(shù)據(jù)的容器
集合框架包含了兩部分:一部分是接口,一部分是類
4.為什么會(huì)出現(xiàn)接口:因?yàn)榧峡蚣苤械暮芏囝?功能是相似的【所以用接口來(lái)規(guī)范類】
主要結(jié)構(gòu)圖:
注:在"集合框架"中,接口 Map 和 Collection 在層次結(jié)構(gòu)沒(méi)有任何親緣關(guān)系,它們是截然不同的。
不要簡(jiǎn)單的認(rèn)為集合類機(jī)會(huì)就這些,jdk中集合類有很多這些不過(guò)是我們經(jīng)常用到的而已
Collection、List、Set、Queue和Map都是接口(Interface),不是具體的類實(shí)現(xiàn)。
一.List[public interface List<E>extends Collection<E>]:
A.有序的集合接口,可以對(duì)列表中每個(gè)元素的插入位置進(jìn)行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問(wèn)元素,并搜索列表中的元素。
B.與 set 不同,列表通常允許重復(fù)的元素。更正式地說(shuō),列表通常允許元素e1和元素e2滿足e1.equals(e2).并且如果列表本身允許null 元素的話,通常它們?cè)试S多個(gè) null 元素。難免有人希望通過(guò)在用戶嘗試插入重復(fù)元素時(shí)拋出運(yùn)行時(shí)異常的方法來(lái)禁止重復(fù)的列表
C.List 接口在 iterator、add、remove、equals 和 hashCode 方法的協(xié)定上加了一些其他約定,更加規(guī)范了 Collection 接口中指定的約定。為方便起見(jiàn),這里也包括了其他繼承方法的聲明
D.List 接口提供了 4 種對(duì)列表元素進(jìn)行定位(索引)訪問(wèn)方法。列表(像 Java 數(shù)組一樣)是基于 0 的。注意,這些操作可能在和某些實(shí)現(xiàn)(例如 LinkedList 類)的索引值成比例的時(shí)間內(nèi)執(zhí)行。因此,如果調(diào)用方不知道實(shí)現(xiàn),那么在列表元素上迭代通常優(yōu)于用索引遍歷列表
E. 除了具有Collection接口必備的iterator()方法外,List還提供一個(gè)listIterator()方法,返回一個(gè) ListIterator接口,和標(biāo)準(zhǔn)的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。
至于 List提供如下方法:
List接口實(shí)現(xiàn)類很多:
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector 一般情況下主要用到的是ArrayList,和LinkedList,其他的類并不是說(shuō)沒(méi)用
ArrayList
ArrayList允許所有元素包括null。ArrayList沒(méi)有同步
理解一:ArrayList 使用一個(gè)內(nèi)置的數(shù)組來(lái)存儲(chǔ)元素,這個(gè)數(shù)組的起始容量是10.當(dāng)數(shù)組需要增長(zhǎng)時(shí),新的容量按如下公式獲得:新容量=(舊容量*3)/2+1,也就是說(shuō)每一次容量大概會(huì)增長(zhǎng)50%。這就意味著,如果你有一個(gè)包含大量元素的ArrayList對(duì)象,那么最終將有很大的空間會(huì)被浪費(fèi)掉,這個(gè)浪費(fèi)是由 ArrayList的工作方式本身造成的。如果沒(méi)有足夠的空間來(lái)存放新的元素,數(shù)組將不得不被重新進(jìn)行分配以便能夠增加新的元素。
對(duì)數(shù)組進(jìn)行重新分配,將會(huì)導(dǎo)致性能急劇下降。如果我們知道一個(gè)ArrayList將會(huì)有多少個(gè)元素,我們可以通過(guò)構(gòu)造方法來(lái)指定容量。我們還可以通過(guò)trimToSize方法在 ArrayList分配完畢之后去掉浪費(fèi)掉的空間。
理解二:ArrayList是用數(shù)組實(shí)現(xiàn)的,它不是真正的鏈表,在初始化的時(shí)候它先對(duì)數(shù)組設(shè)置一個(gè)初始容量,當(dāng)數(shù)組空間不夠的時(shí)候,它會(huì)重新構(gòu)建一個(gè)容量更大的數(shù)組,然后把先前的元素拷貝進(jìn)去
不管是一還是二暫且不管他存放元素的方式。***一點(diǎn)可以確認(rèn)他使用內(nèi)置的數(shù)組
LinkedList
List接口的鏈接列表實(shí)現(xiàn)。實(shí)現(xiàn)所有可選的列表操作,并且允許所有元素(包括 null)。除了實(shí)現(xiàn) List 接口外,
LinkedList 類還為在列表的開(kāi)頭及結(jié)尾 get、remove 和 insert 元素提供了統(tǒng)一的命名方法。這些操作允許將鏈接列表用作堆棧、隊(duì)列或雙端隊(duì)列 (deque)。此類實(shí)現(xiàn) Queue 接口,為 add、poll 等提供先進(jìn)先出隊(duì)列操作。其他堆棧和雙端隊(duì)列操作可以根據(jù)標(biāo)準(zhǔn)列表操作方便地進(jìn)行再次強(qiáng)制轉(zhuǎn)換。雖然它們可能比等效列表操作運(yùn)行稍快,但是將其包括在這里主要是出于方便考慮.
希望通過(guò)以上內(nèi)容的介紹,能夠給你帶來(lái)幫助。