“簡單不先于復雜,而是在復雜之后.” —— Alan Perlis
首行推薦——http://www.lxweimin.com/p/ba0fdee47cb4
ArrayList和LinkedList都是實現了List接口的類,他們都是元素的容器,用于存放對象的引用;
他們都可以對存放的元素進行增刪改查的操作,還可以進行排序。
但是,他們還是有區別的。
除了實現對List接口的實現,他們還實現了其他的接口,由此造就了他們之間的差異;
ArrayList
ArrayList:內部使用數組的形式實現了存儲,實現了RandomAccess接口,利用數組的下面進行元素的訪問,因此對元素的隨機訪問速度非常快。
因為是數組,所以ArrayList在初始化的時候,有初始大小10,插入新元素的時候,會判斷是否需要擴容,擴容的步長是0.5倍原容量,擴容方式是利用數組的復制,因此有一定的開銷;
另外,ArrayList在進行元素插入的時候,需要移動插入位置之后的所有元素,位置越靠前,需要位移的元素越多,開銷越大,相反,插入位置越靠后的話,開銷就越小了,如果在最后面進行插入,那就不需要進行位移;
LinkedList
LinkedList:內部使用雙向鏈表的結構實現存儲,LinkedList有一個內部類作為存放元素的單元,里面有三個屬性,用來存放元素本身以及前后2個單元的引用,另外LinkedList內部還有一個header屬性,用來標識起始位置,LinkedList的第一個單元和最后一個單元都會指向header,因此形成了一個雙向的鏈表結構。
LinkedList是采用雙向鏈表實現的。所以它也具有鏈表的特點,每一個元素(結點)的地址不連續,通過引用找到當前結點的上一個結點和下一個結點,即插入和刪除效率較高,只需要常數時間,而get和set則較為低效。
LinkedList的方法和使用和ArrayList大致相同,由于LinkedList是鏈表實現的,所以額外提供了在頭部和尾部添加/刪除元素的方法,也沒有ArrayList擴容的問題了。另外,ArrayList和LinkedList都可以實現棧、隊列等數據結構,但LinkedList本身實現了隊列的接口,所以更推薦用LinkedList來實現隊列和棧。
綜上所述,在需要頻繁讀取集合中的元素時,使用ArrayList效率較高,而在插入和刪除操作較多時,使用LinkedList效率較高。