arraylist删除指定元素_面试官:谈谈常用的Arraylist和Linkedlist的区别
Arraylist:底層是基于動態數組,根據下表隨機訪問數組元素的效率高,向數組尾部添加元素的效率高;但是,刪除數組中的數據以及向數組中間添加數據效率低,因為需要移動數組。
例如最壞的情況是刪除第一個數組元素,則需要將第2至第n個數組元素各向前移動一位。而之所以稱為動態數組,是因為Arraylist在數組元素超過其容量大,Arraylist可以進行擴容(針對JDK1.8 數組擴容后的容量是擴容前的1.5倍),Arraylist源碼中最大的數組容量是Integer.MAX_VALUE-8。
對于空出的8位,目前解釋是 :①存儲Headerwords;②避免一些機器內存溢出,減少出錯幾率,所以少分配③最大還是能支持到Integer.MAX_VALUE(當Integer.MAX_VALUE-8依舊無法滿足需求時)。
以下是Arraylist部分源碼:
Arraylist擴容:
Arraylist添加數據:(向數組尾部添加)
向數組的指定位置添加數組:
可以看到,只要ArrayList的當前容足夠大,add()操作向數組的尾部的效率非常高的,當向數組指定位置添加數據時,會進行大量的數組移動復制操作。而數組復制時,最終將調用System.arraycopy()方法,因此add()操作的效率還是相當高的。往期:一百期面試題匯總
盡管這樣當向指定位置添加數據時也還是比Linkedlist慢,后者添加數據只需要改變指針指向即可。Arraylist刪除數組也需要移動數組,效率較慢。
Linkedlist基于鏈表的動態數組,數據添加刪除效率高,只需要改變指針指向即可,但是訪問數據的平均效率低,需要對鏈表進行遍歷。
Arraylist get數據的源碼:(根據下標訪問,效率高)
Linkedlist訪問數據的源碼:(node()函數遍歷鏈表)
總結:
1、對于隨機訪問get和set,ArrayList優于LinkedList,因為LinkedList要移動指針。對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。
2、各自效率問題:
來源:http://blog.csdn.net/weixin_42468526/article/details/81178698
總結
以上是生活随笔為你收集整理的arraylist删除指定元素_面试官:谈谈常用的Arraylist和Linkedlist的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: beanutils工具类_Apache
- 下一篇: java json 转map_Java对