LinkedList與ArrayList都是List接口的具體實現(xiàn)類。LinkedList與ArrayList在功能上也是大體一致,但是因為兩者具體的實現(xiàn)方式不一致,所以在進行一些相同操作的時候,其效率也是有差別的。
對于抽象的數(shù)據(jù)結(jié)構(gòu)——線性表而言,線性表分為兩種,一種是順序存儲結(jié)構(gòu)的順序表,另一種是通過指針來描述其邏輯位置的鏈表。
針對于具體的Java實現(xiàn):

  • 順序存儲的順序表是用數(shù)組來實現(xiàn)的,以數(shù)組為基礎(chǔ)進行封裝各種操作而形成的List為ArrayList

  • 鏈表是用指針來描述其邏輯位置,在Java中以雙向鏈表為基礎(chǔ)進行封裝各種操作而形成的List為LinkedList

針對插入與刪除操作,ArrayList每插入一個元素,首先需要判斷數(shù)組的空間夠不夠,不夠要進行擴容,在有足夠的空間的基礎(chǔ)上,在指定的index位置上插入元素,但是該index及以后的元素都要后移。雖然刪除操作不需要判斷空間夠不夠,但同樣需要該index及以后的元素向前移動,這些移動的操作會增加時間的復(fù)雜度。但是對于LinkedList就不一樣,因為使用指針來指示其邏輯的位置,所以插入與刪除的操作的時間復(fù)雜度都是 ** O(1) **

雖然對于ArrayList而言,插入與刪除的時間復(fù)雜度很高,但是對于查找指定位置的元素這種操作而言,就非常的快,因為可以通過數(shù)組直接得到該下標對應(yīng)的元素。反而,LinkedList而言,無法直接返回指定位置的元素,需要一個個查詢,其時間的復(fù)雜度就是 ** O(n) **

與實現(xiàn)ArrayList教程一樣,實現(xiàn)的目的主要在于練手以及掌握官方實現(xiàn)的原理和一些技巧,因此很多需要與其他類配合的方法和功能,就先不在這里實現(xiàn)如iterator

網(wǎng)友評論