更新時間:2020-07-15 16:43:29 來源:動力節點 瀏覽2736次
ArrayList是基于Object數組實現的,我們可以通過下標來實現對元素的取,即可以實現隨機訪問,但是在插入的時候,需要移動大量元素,所以對于能夠隨機訪問,而不經常進行增刪的需求,我們盡量使用ArrayList。而LinkedList是基于鏈表實現的,那么在進行增刪的時候,只需要修改相應的指針,就可以實現元素的增刪,效率非常高,所以對于需要快速增刪元素,應該選擇LinkedList。
我們不僅要好奇,為什么LinkedList的插入效率這么高呢?下面我們通過源碼來一探究竟。
從中,我們可以看出:通過add(int index,E element)向LinkedList插入元素時。先是在雙向鏈表中找到要插入節點的位置index;找到之后,再插入一個新節點。
雙向鏈表查找index位置的節點時,有一個加速動作:若index<雙向鏈表長度的1/2,則從前向后查找;否則,從后向前查找。所以LinkedList的插入效率非常高,與之形成對比的,就是ArrayList的插入了。
從上面的方法可以看出,在進行插入之前,首先會調用ensureCapacity()方法,來保證ArrayList的容量,如果容量不足,首先要進行擴容,然后真正費時的就是這句:
System.arraycopy(elementData,index,elementData,index+1,size-index)
這句話表明,在插入的時候,會移動index后面的所有元素,這就是ArrayList插入元素效率低的原因。
下面我們來分析一下ArrayList和LinkedList隨機訪問的效率。
首先來看LinkedList的隨機訪問:
對于LinkedList來說,隨機訪問第index的元素,從頭結點開始遍歷,查找到index的位置,然后返回元素,這里只不過有一個加速遍歷的動作而已。
但是對于ArrayList來說就不同了:
從中,我們可以看出:通過get(int index)獲取ArrayList第index個元素時。直接返回數組中index位置的元素,而不需要像LinkedList一樣進行查找。
以上就是動力節點java培訓機構的小編針對“Java中list的使用之List的應用場景”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習