ArrayList:內部使用數組的形式實現了儲存,實現了RandomAccess接口,因此對元素的隨機訪問速度非常快,因為是數組,所以ArrayList在初始化的時候,有初始大小10,插入新元素的時候會判斷是否需要擴容,擴容的步長是0.5倍原容量,擴容方式是利用數組的復制,因此有一定的開銷,另外,ArrayList在進行元素插入的時候,需要移動插入位置之后的所有元素,位置越靠前,需要位移的元素越多,開銷越大,相反,插入位置越靠后的話,開銷就越小了,如果在最后面進行插入,那就不需要進行位移。
LinkedList:內部使用雙向鏈表的結構實現儲存,LinkedList有一個內部類作為存放元素的單元,里面有三個屬性,用來存放元素本身以及前后2個單元的引用,另外LinkedList內部還有一個header屬性,用來標識起始位置,LinkedList的第一個單元和最后一個單元都會指向header,因此形成了一個雙向的鏈表結構LinkedList的元素並不需要連續存放,但是每個存放元素的單元比元素本身需要更大的空間,LinkedList對空間的要求比較大,但是擴容的時候不需要進行數組復制,因此沒有這一環節的開銷但是,LinkedList的隨機訪問速度慘不忍睹,因為無論你要訪問哪一個元素,都需要從header起步正向或反向的進行元素遍歷。
由此可見,ArrayList適合需要大量進行隨機訪問或者對靠近集合中尾部的元素進行增刪的場景;而LinkedList則適合對靠近集合首部的元素進行增刪的場景。
參考博文:https://www.jianshu.com/p/5b3aa50aa388