List?概述:
1泳秀、List :一個(gè)元素有序丐枉、可重復(fù)的集合娜睛。
集合中每個(gè)元素都有其對(duì)應(yīng)的順序索引。List 集合允許使用重復(fù)元素卦睹,可以通過索引來訪問指定位置的集合元素畦戒。下面示例是 List 的用法。
我們可以直接通過 add 方法添加元素结序,使用 add 方法的時(shí)候也可以根據(jù)索引值將數(shù)據(jù)插入特定位置障斋;可以通過 set 方法修改指定索引值位置的元素;可以獲取指定元素的索引值徐鹤。
2垃环、List是根據(jù) equals()方法的返回值是否為 true 來 判斷兩個(gè)對(duì)象是否相等。
當(dāng)我們通過 indexOf 方法獲取指定元素的索引值的時(shí)候返敬,List 是如何在集合內(nèi)找到我們傳入的元素對(duì)象的呢遂庄?換句話說,就是List 集合是如何判斷兩個(gè)元素是相等的呢劲赠?我們看下面這個(gè)例子:
類 E 中涛目,我們重寫了 equals()方法,直接返回 true凛澎。當(dāng)我們執(zhí)行 remove 方法的時(shí)候霹肝,List 會(huì)將集合中的元素作為參數(shù)傳給類 E 的 equals 方法。因?yàn)樵摲椒偸欠祷?true塑煎,所以每次都會(huì)刪除集合中第一個(gè)元素阿迈。
ArrayList:
a、ArrayList 是 List 的一個(gè)實(shí)現(xiàn)類轧叽,完全支持我們上面所說的 List 的用法苗沧。ArrayList 類是基于數(shù)組實(shí)現(xiàn)的,所以 ArrayList 封裝了一個(gè)動(dòng)態(tài)的炭晒、允許再分配的 Object[] 數(shù)組待逞。ArrayList 對(duì)象使用 initialCapacity 參數(shù)來設(shè)置該數(shù)組的長度。當(dāng)添加元素的數(shù)量超出了該數(shù)組的長度時(shí)网严,它們的 initialCapacity 會(huì)自動(dòng)增加识樱。
b、正常使用時(shí)震束,我們無需關(guān)系 ArrayList 的 initialCapacity怜庸。但是,如果我們需要向集合中添加大量元素的時(shí)候垢村,我們可以使用ensureCapacity(int minCapacity)一次添加 initialCapacity割疾,這樣做可以減少重分配次數(shù),提高性能嘉栓。
c宏榕、當(dāng)我們集合的元素?cái)?shù)量確定不再改變時(shí)拓诸,我們還可以使用 trimToSize()方法調(diào)整集合長度為當(dāng)前元素個(gè)數(shù),這樣我們可以減少集合對(duì)象占用的存儲(chǔ)空間麻昼。
d奠支、ArrayList 集合同樣是線程不安全的,多個(gè)線程同時(shí)操作一個(gè)集合時(shí)抚芦,我們需要手動(dòng)保證線程安全倍谜。可以使用 Collections 工具類叉抡。
LinkedList:
LinkedList 類是 List 的一個(gè)實(shí)現(xiàn)類枢劝,所以它是一個(gè) List 集合,可以通過索引來隨機(jī)訪問集合中的元素卜壕;同時(shí),它也實(shí)現(xiàn)了Deque 接口烙常,可以當(dāng)成雙端隊(duì)列使用轴捎。(Deque 代表一個(gè)“雙端隊(duì)列”,雙端隊(duì)列可以從兩端來添加刪除數(shù)據(jù)蚕脏,因此 Deque 的實(shí)現(xiàn)類既可以當(dāng)成隊(duì)列使用侦副,也可以當(dāng)成棧使用)。我們看下面的示例:
上面例子中驼鞭,我們分別使用了 List 集合秦驯、雙端隊(duì)列,棧的用法挣棕。首先译隘,我們通過 offer 方法,將元素 Jack 加入到隊(duì)列的尾部洛心;通過 push 方法將元素 Tom 加入到棧的頂部固耘;通過 offerFirst 方法將元素 Bruce 添加到隊(duì)列的頭部(相當(dāng)于棧的頂部)。然后词身,用 List 通過索引的方式遍歷集合厅目。之后依次展現(xiàn)訪問棧頂元素方法,訪問隊(duì)列最后一個(gè)元素方法法严,彈出棧頂方法损敷,訪問并刪除隊(duì)列最后一個(gè)元素方法。所以深啤,LinkedList 集合的用法還是很強(qiáng)大的拗馒。
ArrayList 的內(nèi)部是基于數(shù)組的集合的實(shí)現(xiàn)方式,LinkedList 內(nèi)部是以鏈表的形式來保存集合中的元素溯街,相對(duì)于數(shù)組的實(shí)現(xiàn)形式瘟忱,鏈表的形式在隨機(jī)訪問集合內(nèi)元素的時(shí)候性能較差奥额,但是插入和刪除元素性能比較好(只需改變指針?biāo)傅刂芳纯桑?/p>
List?總結(jié):
a、List 是一個(gè)線性表接口访诱,ArrayList 和 LinkedList 是線性表的兩種典型實(shí)現(xiàn):基于數(shù)組的線性表和基于鏈的線性表垫挨。一般來說,數(shù)組以一塊連續(xù)內(nèi)存區(qū)來保存所有的數(shù)組元素触菜,所以九榔,數(shù)組在隨機(jī)訪問時(shí)性能最好,所有內(nèi)部以數(shù)組作為底層實(shí)現(xiàn)的集合在隨機(jī)訪問的時(shí)候性能都比較好涡相;而內(nèi)部以鏈表作為底層實(shí)現(xiàn)的集合在執(zhí)行插入哲泊、刪除操作時(shí)性能比較好;但總體來說催蝗,ArrayList 的性能要比 LinkedList 的性能要好切威,因此我們優(yōu)先考慮使用 ArrayList。
b丙号、如果遍歷 List 集合先朦,對(duì)于 ArrayList,我們考慮使用隨機(jī)訪問(get 方法)遍歷犬缨,對(duì)于 LinkedList 考慮采用迭代器(Iterator)遍歷喳魏。
c、多個(gè)線程同時(shí)操作 List 集合的時(shí)候怀薛,我們需要手動(dòng)保證線程安全刺彩,可以使用工具類 Collections 將集合包裝成線程安全的集合。