Java基础 ArrayList和LinkedList的区别和实现原理
????????ArrayList?和 LinkedList都是List的實現(xiàn)類,List集合主要有兩個特點:1、有序;2、可重復(fù)。所以他們兩個肯定也有其特征。
????????下面分別介紹下二者:
?1、ArrayList---?數(shù)組列表
?
????上圖是ArrayList的源碼,可以看出Java在構(gòu)建ArrayList的時候是默認(rèn)初始容量為10的空列表,底層使用數(shù)組保存所有元素。
? 從他的構(gòu)造器可以看出有三種方式的構(gòu)造器:
?????????????????????????????1、構(gòu)造一個默認(rèn)初始容量為10的(這里是初始容量,而不是size());
?????????????????????????????2、構(gòu)造一個指定初始容量的空列表。
?????????????????????????????3、構(gòu)造一個包含指定集合的元素列表,
????????????????? ? 這里的容量是指在jvm堆內(nèi)存中開辟的空間。
? ??? ? 下圖是源碼中我們最常用的ArrayList的get(),set(),add(),remove();(增刪改查)的方法,可以看出都是對數(shù)組進(jìn)行操作。所以ArrayList具有數(shù)組的優(yōu)缺點就是,有利于查找修改快,而增加和刪除相對慢一些。例如,當(dāng)增加或刪除某一位時,需要移動大量元素。
2、LinkedList--鏈表列表
? 老套路,直接先上源碼:? ?
????源碼上我們能清晰的看到LinkedList同樣實現(xiàn)了List并且還實現(xiàn)了deque(隊列),即循環(huán)雙向鏈表的數(shù)據(jù)結(jié)構(gòu)。
????????????? ? 其結(jié)構(gòu)是有一些列鏈表拼接而成,主要前后節(jié)點,和大小。并且它在初始化后默認(rèn)是空。
? ? 下圖是LinkedList常用的增刪改查的方法(只列舉了一部分),可以看到是典型鏈表的方式,查找某一節(jié)點,在設(shè)置對應(yīng)節(jié)點的值。如果進(jìn)行增刪操作只需找到對應(yīng)節(jié)點更改里面內(nèi)容,當(dāng)進(jìn)行遍歷訪問時,如果用for(隨機(jī)訪問遍歷)總會進(jìn)行一次列表的遍歷操作,遍歷每個的前后節(jié)點移動指針,所以性能很低。
總結(jié)?區(qū)別:
????? ? 1、二者實現(xiàn)結(jié)構(gòu)不同arraylist是基于數(shù)組,linkedlist是基于鏈表,他們的特性也是由其數(shù)據(jù)結(jié)構(gòu)決定的。
????? ? 2、隨機(jī)遍歷訪問時linkedlist的性能要低于arraylist.
????? ? 3、arraylist的初始化時默認(rèn)10容量,而linkedlist默認(rèn)初始化為空。
????? ? 4、linkedlist的增刪要優(yōu)于arraylist
總結(jié)
以上是生活随笔為你收集整理的Java基础 ArrayList和LinkedList的区别和实现原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql常用查询命令
- 下一篇: Java基础 HashMap实现原理及方