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 將集合包裝成線程安全的集合。