ArrayListLinkedList 性能比较
生活随笔
收集整理的這篇文章主要介紹了
ArrayListLinkedList 性能比较
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在對比List下的兩大功臣,功臣之一為ArrayList;功臣之二為LinkedList;
通過這次再次深入理解,有了如下的幾點重新價值觀刷新:
- 【插入】我們都知道因為ArrayList底層是數組實現的;LinkedList底層是鏈表實現的;所以對于新增數據而言,肯定是LinkedList性能遠遠高于ArrayList的性能;但實踐結果并非如此,ArrayList的新增性能并不低,而且通過測試,其比LinkedList插入速度還快。(測試JDK版本 1.8)
- 【獲取】由于LinkedList是鏈表結構,沒有角標的概念,沒有實現RandomAccess接口,不具備隨機元素訪問功能,所以在get方面表現的差強人意,ArrayList再一次完勝。具體為何LinkedList會這么慢呢?其實是因為LinkedList是鏈表結構,沒有角標的概念,沒有實現RandomAccess接口,不具備隨機元素訪問功能,所以在get方面表現的差強人意
- 【隨機根據某個索引插入元素,到底誰快呢?】
操作代碼如下:
| 0 | 3646828 | 33657 |
| 10 | 3670657 | 33118 |
| 100 | 3628176 | 33256 |
| 1000 | 3270814 | 44075 |
| 10000 | 3696530 | 128725 |
| 100000 | 3656730 | 1010909 |
| 1000000 | 3606553 | 10099185 |
- 【隨機刪除某一個位置的元素,到底誰快呢?】
remove關鍵代碼
linkedList.remove(0);linkedList.remove(10);linkedList.remove(100);linkedList.remove(1000);linkedList.remove(10000);linkedList.remove(100000);linkedList.remove(1000000);arrayList.remove(0);arrayList.remove(10);arrayList.remove(100);arrayList.remove(1000);arrayList.remove(10000);arrayList.remove(100000);arrayList.remove(1000000);| 0 | 3319289 | 16816 |
| 10 | 3796653 | 17964 |
| 100 | 3462862 | 19898 |
| 1000 | 3474424 | 27497 |
| 10000 | 3320296 | 113838 |
| 100000 | 3312930 | 1803475 |
| 1000000 | 3029520 | 10050950 |
當看到如上數據時,不知道第一感是作何感受?其實當理解了其底層實現的時候,就不吃驚了。
通過如上數據可以發現,對于ArrayList而言,其不管是通過索引增加到哪個位置還是移除某個元素,其用的時間都是均等的;而對于LinkedList而言,則隨著索引的增加用的時間逐漸增大。所以以上得到結論:
- void add(int index, E element) 當數據量超過6位數之后,則考慮使用ArrayList吧
- E remove(int index) 當數據量超過6位數之后,則考慮使用ArrayList吧
為何會出現這么大的差距呢?上述文章中我們曾提到過,對于ArrayList而言,因為其實現了RandomAccess,有了快速隨機訪問存儲元素的功能,所以只要是通過索引的操作,其都是通過角標實現的,進而不用遍歷整個集合,所以效率更高。
轉載于:https://www.cnblogs.com/huohuoL/p/10545414.html
總結
以上是生活随笔為你收集整理的ArrayListLinkedList 性能比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [NOI2016]区间-线段树
- 下一篇: golang中map并发读写问题及解决方