1. 程式人生 > >【修真院JAVA小課堂】List集合

【修真院JAVA小課堂】List集合

大家好,我是IT修真院深圳分院第十二期學員,一枚正直純潔善良的JAVA程式設計師。

今天給大家分享一下,修真院官網JAVA任務十的一個知識點:List集合

深入學習網址:http://www.jnshu.com/login/1/12744596

願不再有程式渣,我們只生產程式碼,而不是生產BUG。

 

1.背景介紹

2.知識剖析

3.常見問題

4.解決方案

5.編碼實戰

6.擴充套件思考

7.參考文獻      

8.更多討論

 

1.背景介紹   

集合,或者叫容器,是一個包含多個元素的物件;集合可以對資料進行儲存,檢索,操作;集合的作用就是以一定的方式組織、儲存資料。集合類存放於java.util包中。而我們使用的一些集合都是實現的java.util.Collection 這個集合介面。 集合型別主要有3種:set(集)、list(列表)和map(對映)。

 

2.知識剖析

    2.1.對於集合需要關注的四個點

    2.2.ArrayList原始碼分析

    2.3.ArrayList的優缺點

    2.4.ArrayList和Vector的區別

 

2.1.對於集合需要關注的四個點

1、是否允許空

2、是否允許重複資料

3、是否有序,有序的意思是讀取資料的順序和存放資料的順序是否一致

4、是否執行緒安全

 

關  注  點 結      論
ArrayList是否允許空 允許
ArrayList是否允許重複資料 允許
ArrayList是否有序 有序
ArrayList是否執行緒安全

非執行緒安全

 

 

2.2.ArrayList原始碼分析

 

2.3.ArrayList的優缺點

1、ArrayList底層以陣列實現,是一種隨機訪問模式,再加上它實現了RandomAccess介面,因此查詢也就是get的時候非常快

2、ArrayList在順序新增一個元素的時候非常方便,只是往數組裡面添加了一個元素而已

不過ArrayList的缺點也十分明顯:

1、刪除元素的時候,涉及到一次元素複製,如果要複製的元素很多,那麼就會比較耗費效能

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

因此,ArrayList比較適合順序新增、隨機訪問的場景

 

3.常見問題

    3.1.ArrayList是執行緒不安全的,那麼想保證執行緒安全應該用什麼? 

    3.2.ArrayList刪除的速度較慢,為什麼? 

    3.3.ArrayList的容量必須滿足1.5倍擴容麼? 

 

4.解決方案

     4.1.ArrayList是執行緒不安全的,那麼想保證執行緒安全應該用什麼? 

ArrayList是執行緒非安全的,這很明顯,因為ArrayList中所有的方法都不是同步的,在併發下一定會出現執行緒安全問題。那麼我們想要使用ArrayList並且讓它執行緒安全怎麼辦?一個方法是用

//Collections.synchronizedList方法把你的ArrayList變成一個執行緒安全的List,比如:

List<String>synchronizedList=Collections.synchronizedList(list);

synchronizedList.add("aaa");

synchronizedList.add("bbb");

for(inti=0;i<synchronizedList.size();i++){

System.out.println(synchronizedList.get(i));

}

 

另一個方法就是Vector,它是ArrayList的執行緒安全版本,其實現90%和ArrayList都完全一樣,區別在於:

1、Vector是執行緒安全的,ArrayList是執行緒非安全的

2、Vector可以指定增長因子,如果該增長因子指定了,那麼擴容的時候會每次新的陣列大小會在原陣列的大小基礎上加上增長因子;如果不指定增長因子,那麼就給原陣列大小*2,原始碼是這樣的:


 

intnewCapacity=oldCapacity+((capacityIncrement>0)?

capacityIncrement:oldCapacity);

   4.2.ArrayList刪除的速度較慢,為什麼? 

因為ArrayList在刪除的時候,需要將該元素之後的所有元素全部往前移,也就是說除了刪除這個元素之外,還需要做很多額外的操作,所以耗時較久

 

   4.3.ArrayList的容量必須滿足1.5倍擴容麼? 

是的,因為原始碼中已經寫死了相關機制。

 

//以下為原始碼privatevoidgrow(intminCapacity){//overflow

    -consciouscodeintoldCapacity=elementData.length;

    //分析這一步,就可以得出新容量值是舊容量值的1.5倍intnewCapacity=oldCapacity

    +(oldCapacity>>1);if(newCapacity-minCapacity<0)newCapacity

    =minCapacity;if(newCapacity-MAX_ARRAY_SIZE>0)newCapacity=hugeCapacity

    (minCapacity);//minCapacityisusuallyclosetosize,sothisisawin

    :elementData=Arrays.copyOf(elementData,newCapacity);}

 

 

5.編碼實戰

   

6.擴充套件思考

     

7.參考文獻      

     CSDN、百度百科

 

8.更多討論

8.1.什麼情況下你會使用ArrayList?什麼時候你會選擇LinkedList?

這又是一個大多數面試者都會困惑的問題。多數情況下,當你遇到訪問元素比插入或者是刪除元素更加頻繁的時候,你應該使用ArrayList。另外一方面,當你在某個特別的索引中,插入或者是刪除元素更加頻繁,或者你壓根就不需要訪問元素的時候,你會選擇LinkedList。這裡的主要原因是,在ArrayList中訪問元素的最糟糕的時間複雜度是”1″,而在LinkedList中可能就是”n”了。在ArrayList中增加或者刪除某個元素,通常會呼叫System.arraycopy方法,這是一種極為消耗資源的操作,因此,在頻繁的插入或者是刪除元素的情況下,LinkedList的效能會更加好一點。

 

8.2.如何複製某個ArrayList到另一個ArrayList中去?寫出你的程式碼?

下面就是把某個ArrayList複製到另一個ArrayList中去的幾種技術:

  1. 使用clone()方法,比如ArrayList newArray = oldArray.clone();

  2. 使用ArrayList構造方法,比如:ArrayList myObject = new ArrayList(myTempObject);

  3. 使用Collection的copy方法。

注意1和2是淺拷貝(shallow copy)。

 

8.3.Collection和Collections的區別

java.util.Collection 是一個集合介面。它提供了對集合物件進行基本操作的通用介面方法。Collection介面在Java 類庫中有很多具體的實現。Collection介面的意義是為各種具體的集合提供了最大化的統一操作方式。

java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多型方法。此類不能例項化,就像一個工具類,服務於Java的Collection框架。

 

今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~

技能樹.IT修真院   

  “我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫”。

   這裡是技能樹.IT修真院,成千上萬的師兄在這裡找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。

快來與我一起學習吧~

騰訊視訊: