ArrayList 和 LinkedList实践与分析

对于ArrayList & LinkedList插入效率的问题,以前的理解是 ArrayList需要将插入点后边的全部数组位置改变,而LinkedList是由链表实现,因此随机位置插入只需要断开node前后的指向,所以LinkedList的效率应该是快的,可实践的情况却略有偏差。

上图 代码如下:

ArrayList 和 LinkedList实践与分析_第1张图片

四种情况的运行结果如下:

前段插入

ArrayList :342ms

LinkedList:20ms

尾部插入

ArrayList :27ms

LinkedList:43ms

中间插入

ArrayList :200ms

LinkedList:8784ms

随机插入

ArrayList :229ms

LinkedList:6687ms

从现象上看,ArrayList自己的操作而言前段比尾段慢,应该是由于每次copy数组的长度不同导致的开销,可以理解。可是LinkedList在两端的操作很快,中间非常非常慢,又是为何?

从源码中获的了一些猜想


ArrayList 和 LinkedList实践与分析_第2张图片
ArrayList 和 LinkedList实践与分析_第3张图片
ArrayList 和 LinkedList实践与分析_第4张图片

LinkedList首先要找到位置为index的那个node然后把要插入的element放在它的前边,在寻找node的过程先判断index是在前半段还是后半段,在前半段的话从first往后找,在后半段的话从last往前找。那么如果index在中间位置的话,查找速度必然最慢。那么再回头看看数据里的两端快,中部慢现象。所以查找node节点的过程应该造成了更多的开销。

你可能感兴趣的:(ArrayList 和 LinkedList实践与分析)