ArrayList,LinkedList,Vector的區別


ArrayList總結
  1. 底層數組實現,使用默認構造方法初始化出來的容量是10
  2. 擴容的長度是在原長度基礎上加二分之一
  3. 實現了RandomAccess接口,底層又是數組,get讀取元素性能很好
  4. 線程不安全,所有的方法均不是同步方法也沒有加鎖,因此多線程下慎用
  5. 順序添加很方便
  6. 刪除和插入需要復制數組 性能很差(可以使用LinkindList)

ArrayList和Vector的區別

標准答案
  1. ArrayList是線程不安全的,Vector是線程安全的
  2. 擴容時候ArrayList擴0.5倍,Vector擴1倍
  3. 初始擴容值都為10

那么問題來了

ArrayList有沒有辦法線程安全?

Collections工具類有一個synchronizedList方法

可以把list變為線程安全的集合,但是意義不大,因為可以使用Vector

Vector為什么是線程安全的?

老實講,拋開多線程 它倆區別沒多大,但是多線程下就不一樣了,因為Vector的關鍵方法都使用了synchronized修飾。

 

LinkedList 是雙向列表。根據index處於前半段還是后半段,來判斷已頭結點還是尾結點為起來來遍歷,來獲得當前index所代表的值

  • 鏈表批量增加,是靠for循環遍歷要添加的數組,依次執行插入節點操作。對比ArrayList是通過System.arraycopy完成批量增加的。增加一定會修改modCount。
  • 通過下標獲取某個node 的時候,(add select),會根據index處於前半段還是后半段 進行一個折半,以提升查詢效率

  • 刪也一定會修改modCount。 按下標刪,也是先根據index找到Node,然后去鏈表上unlink掉這個Node。 按元素刪,會先去遍歷鏈表尋找是否有該Node,如果有,去鏈表上unlink掉這個Node。

  • 改也是先根據index找到Node,然后替換值。改不修改modCount。
  • 查本身就是根據index找到Node。
  • 所以它的CRUD操作里,都涉及到根據index去找到Node的操作。
他還提供了 List 接口中沒有定義的方法,專門用於操作表頭和表尾元素,可以當作堆,棧、隊列和雙向隊列使用,因為它還是實現了Deque接口,而Deque接口同時繼承了Queue接口
而Queue隊列接口也同屬於Collection接口下面




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM