天天看點

【Java集合系列】---ArrayList

開篇前言--ArrayList中的基本方法

前面的博文中,小編主要簡單介紹java集合的總體架構,在接下來的博文中,小編将詳細介紹裡面的各個類,通過demo、對比,來對java集合類進行更加深入的了解和認識,希望可以幫助有有需要的小夥伴們`(*∩_∩*)′,不足之處,還請小夥伴們多多指教哦`(*∩_∩*)′。今天這篇博文,小編主要介紹List接口中的ArrayList集合,ArrayList即數組清單,so,她肯定和數組有一定的關系,我們知道List集合的特征有兩個,一個是有序;第二個List裡面的集合可以重複,既然ArrayList實作了List接口,那麼毫無疑問,她肯定也存在這兩個特征,我們來看一個簡單的demo。建立一個class,命名為ArrayListTest,編寫相關代碼,如下所示:

運作效果如下所示:

以上是ArrayList的基本用法,接着,我們來修改代碼,ArrayList可以添加重複的元素,我們來看下面的代碼部分:

通過運作結果我們知道,說明第二個“java”已經添加進去了,我們發現,ArrayList是通過add進行添加的操作,通過get方法取出來;我們接着來看,size這個方法,傳回清單中元素的個數;可是呢,取資料的時候一個一個取,非常的麻煩,是以,我們可以寫一個循環,如下所示:

size方法,用于擷取集合中元素的個數,接着我們來看Clear()方法,編寫相關代碼,如下所示:

接着,我們來看一下isEmpty這個方法,這個方法是用來判斷集合中是否有内容的一個方法,編寫相關代碼,如下所示:

接着看,如何删除一個元素呢,remove,删除一個根據元素,我們可以根據索引删除,還可以根據具體的對象進行删除,編寫相關代碼,如下所示:

運作,如下所示:

除此之外,我們還可以根據索引進行删除,編寫相關代碼,如下所示:

效果如下所示:

接着,我們添加兩個元素,列印,indexOf某個對象的索引在哪個位置上,代碼如下所示:

運作,效果如下所示:

接着,我們建立一個類ArrayListTest1,編寫相關代碼:

ArrayList本身接收的是對象,取出來的時候我們需要把他轉換成我們放進去的相應的類型。再來建立一個類ArrayListTest2,如何把集合轉成數組呢?編寫代碼,如下所示:

運作如下所示:

ArrayList底層部分源碼實作

前面介紹的都是ArrayList的基本方法,小夥伴們可以查詢API文檔,接着,我們來看ArrayList她自己本身是如何實作的,首先:

a、對于任何一個集合來說,集合中存放的是對象的引用,而不是對象本身。

b、ArrayList底層采用數組實作,當使用不帶參數的構成方法生成ArrayList對象的時候,實際上會在底層生成一個長度為10的Object類型數組。簡單來說ArrayList内部實作是數組。

c、如果增加的元素個數超過了10個,那麼ArrayList底層會新生成一個數組,長度為原來數組的1.5倍,然後将原數組的内容複制到新數組中,并且後續增加的内容都會放到新數組當中,當新數組無法容納增加的元素時,重複該過程。集合中不能放入原生資料類型,隻能放置對象的引用,我們需要使用原生資料類型的包裝類才能加入到集合當中。我們來看看ArrayList底層的部分源碼:

so,小夥伴們發現了沒有,ArrayList 她骨子裡面的本質就是數組, ArrayList就是對數組進行動态的擴充,其add, get , remove 等等操作就是對數組的操作。 ArrayList的一些特性都來源于數組:有序、元素可重複、插入慢、 索引快 等等一系列神馬所謂的屬性, 有沒有一種被欺騙了的趕腳`(*∩_∩*)′。

ArrayList中的周遊

我們來看一下ArrayList中的周遊,ArrayList支援三種周遊方式。

第一種:通過疊代器周遊,即通過Iterator去周遊

第二種:随機通路,通過索引值去周遊,因為ArrayList實作了RandomAccess接口,so,她支援通過索引值去随機通路元素:

第三種:for循環周遊,如下所示:

接着,我們通過一個demo比較一下這三種周遊方式:

運作效果,如下所示:

由此可見,周遊ArrayList時,使用随機通路(即,通過索引序号通路)效率最高,而使用疊代器的效率最低!

ArrayList的優缺點

接着,我們來看一下ArrayList的優缺點:

從上面的幾個過程總結一下ArrayList的優缺點。ArrayList的優點如下:

a、ArrayList底層以數組實作,是一種随機通路模式,再加上它實作了RandomAccess接口,是以查找速度快;

b、ArrayList在順序添加一個元素的時候非常友善,隻是往數組裡面添加了一個元素而已;

ArrayList的缺點:

a、删除元素的時候,涉及到一次元素複制,如果要複制的元素很多,那麼就會比較耗費性能

b、插入元素的時候,涉及到一次元素複制,如果要複制的元素很多,那麼就會比較耗費性能

是以,ArrayList比較适合順序添加、随機通路的場景。在後面的博文中,小編将介紹LinkedList,等介紹完LinkedList之後,我們把她們兩個放在一起進行對比。

     ArrayList線程問題

再說ArrayList線程問題之前,我們需要了解一下,什麼是線程安全?什麼是線程不安全?線程安全就是多線程通路的時候,采用了加鎖機制,當一個線程通路該類的某個資料的時候,進行保護,其他線程不能進行通路直到該線程讀取完,其他線程才可以使用,不會出現資料不一緻或者資料污染。