Android基礎-Collection之List系列

List<E>是Collection<E>接口的子接口。

 

讓我們學習一波常用的List<E>接口的實現類吧,你都知道哪些?

今天我們學習四個:ArrayList、LinkedList、Stack、CopyOnWriteArrayList

 

在學之前,看看List的特點吧!

List接口:

List是有序的Collection,使用此接口可以精確的控制每個元素插入的位置,類似於數組,用戶可以使用索引來訪問List中的元素。和set不同,元素可以重複。

List相比Collection:

  • List提供了一種特殊的iterator遍歷器,叫做ListIterator。這種遍歷器允許遍歷時插入,替換、刪除、雙向訪問。並且還有一個重載方法允許從一個指定位置開始遍歷。

 

  • List在原來的Collection的基礎上,List是一個可以指定索引,有序的容器。

 

ArrayList(數組):

ArrayList實現了可變大小的數組,它允許所有的元素,包括null。ArrayList沒有同步。

ArrayList線程不安全,內部不是原子操作。

 

Vector:

vector非常類似ArrayList,但是Vector是同步的。當一個線程正在迭代的時候,另一個線程改變Vector狀態,會拋異常。

 

LinkedList(雙向鏈表):

LinkedList實現了List接口,允許null元素,此外LinkedList提供了額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(Stack)、隊列(Queue)或者雙向隊列(deque)

 

Stack:

stack繼承Vector,先進後出的棧。

 

CopyOnWriteArrayList:

答:CopyOnWriteArrayList用於讀多寫少的併發場景,比如白名單、黑名單。

CopyOnWrite容器即寫時複製的容器。通俗的理解是當我們往一個容器添加元素的時候,不直接往當前容器添加,而是先將當前容器進行Copy,複製出一個新的容器,然後新的容器裏添加元素,添加完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對CopyOnWrite容器進行併發的讀,而不需要加鎖,因爲當前容器不會添加任何元素。所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器。

CopyOnWriteArrayList(免鎖容器)的好處之一是多個迭代器同時遍歷和修改這個列表時,不會拋出ConcurrentModificationException。在CopyOnWriteArayList中,寫入將會導致創建整個底層數組的副本,而源數組將保留在原地,使得複製的數組在被修改時,讀取操作可以安全地執行。

 

 

 

問題1:ArrayList和LinkedList各自的特點,你怎麼看?

問題2:ArrayList與LinkedList的使用場景和數據結構。

 

問題1:我感覺這個就跟問數組和鏈表的區別沒什麼區別,哈哈。

ArrayList其實是包裝了一個數組 Object[],當實例化一個ArrayList時,一個數組也被實例化,當向ArrayList中添加對象是,數組的大小也相應的改變。這樣就帶來以下有缺點:

快速隨即訪問 你可以隨即訪問每個元素而不用考慮性能問題,通過調用get(i)方法來訪問下標爲i的數組元素。

向其中添加對象速度慢 當你創建數組是並不能確定其容量,所以當改變這個數組時就必須在內存中做很多事情。

操作其中對象的速度慢 當你要想數組中任意兩個元素中間添加對象時,數組需要移動所有後面的對象。

 

LinkedList

LinkedList是通過節點直接彼此連接來實現的。每一個節點都包含前一個節點的引用,後一個節點的引用和節點存儲的值。當一個新節點插入時,只需要修改其中保持先後關係的節點的引用即可,當刪除記錄時也一樣。這樣就帶來以下有缺點:

操作其中對象的速度快 只需要改變連接,新的節點可以在內存中的任何地方

不能隨即訪問 雖然存在get()方法,但是這個方法是通過遍歷接點來定位的所以速度慢。

 

說白了,就是數據結構中的順序存儲和鏈式存儲

 

問題2:

List實現 使用場景 數據結構

ArrayList 數組形式訪問List鏈式集合數據,元素可重複,訪問元素較快 數組

LinkedList 鏈表方式的List鏈式集合,元素可重複,元素的插入刪除較快 雙向鏈表

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章