ArrayList總結
- 底層數組實現,使用默認構造方法初始化出來的容量是10
- 擴容的長度是在原長度基礎上加二分之一
- 實現了RandomAccess接口,底層又是數組,get讀取元素性能很好
- 線程不安全,所有的方法均不是同步方法也沒有加鎖,因此多線程下慎用
- 順序添加很方便
- 刪除和插入需要復制數組 性能很差(可以使用LinkindList)
ArrayList和Vector的區別
標准答案
- ArrayList是線程不安全的,Vector是線程安全的
- 擴容時候ArrayList擴0.5倍,Vector擴1倍
- 初始擴容值都為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接口下面