LinkedList是基於鏈表實現的集合,每一個元素都在記錄上一個元素和下一個元素的內存地址,在增刪改查元素都經過上下元素來實現。下面是源碼的跟蹤過程。node
1 實例化linkedList時只是實例化一個linkedList對象,並無爲元素預留空間數組
2 add()方法,首先是定義了first和last變量來記錄整個鏈表的第一個元素和最後一個元素spa
Node類以下:對象
3 get方法,鏈表的查找元素實現原理是先檢查是否數組下班越界,而後採用相似二分法的方法查找元素,就是根據要查找元素的下標,而後根據下標是否大於鏈表長度的一半來決定從鏈表的頭部開始查找仍是從鏈表尾部查找內存
4 remove方法,remove方法就是經過維護好node的prev和next元素rem
ArrayList其實就是一個Object數組,arrayList對象實例化時就只是初始化了一個空的Object數組get
1 add方法,add方法除了增長元素以外,在增長元素以前先擴容,每次擴容都是擴充現有數組長度的一半,即擴容後的數組長度=擴容前的長度+擴容前長度的一半源碼
2 remove方法其實就是數組的複製ast
總結效率
linkedList和ArrayList的相同在實例化對象時都是實例化LinkedList和ArrayList對象,沒有其餘操做
不一樣點
1 擴容機制不一樣,LinkedList的擴容其實就是每增長一個元素就new Node對象,即增長一個元素就增長一個節點,一個Node對象就至關於擴容一次
2 增刪改不一樣
LinkedList每次增長元素都是new Node對象,而後維護好prev、next、first和next就開了,刪除元素相似,將要刪除的元素設置null,而後維護好上下兩個元素的prev和next
ArrayList則是每次增長元素都會調用Arrays.copyOf方法自動擴充一半的容量,而後再增長元素,
刪除元素是調用System.arraycopy方法從刪除元素的下標+1開始複製數組,而後將最後一個元素設置null
LinkedList的刪除元素效率高,由於ArrayList每次刪除都要進行一次數組複製,而linkedList直接set爲null並維護好prev和next便可;ArrayList修改元素效率高,由於ArrayList的查找效率更高,找到元素以後直接set值便可。新增元素都是經過尾部的方式追加,目前我沒有辦法比較那個效率更高。
3 查找元素機制不一樣
LinkedList是鏈表模式,沒有辦法經過下標直接定位到元素,只能從頭部或尾部經過prev或next變量一個節點一個節點取出目標元素
ArrayList是數組,能夠經過下標直接取出目標元素,ArrayList的查找效率高