对于ArrayList & LinkedList插入效率的问题,以前的理解是 ArrayList需要将插入点后边的全部数组位置改变,而LinkedList是由链表实现,因此随机位置插入只需要断开node前后的指向,所以LinkedList的效率应该是快的,可实践的情况却略有偏差。
上图 代码如下:
四种情况的运行结果如下:
前段插入
ArrayList :342ms
LinkedList:20ms
尾部插入
ArrayList :27ms
LinkedList:43ms
中间插入
ArrayList :200ms
LinkedList:8784ms
随机插入
ArrayList :229ms
LinkedList:6687ms
从现象上看,ArrayList自己的操作而言前段比尾段慢,应该是由于每次copy数组的长度不同导致的开销,可以理解。可是LinkedList在两端的操作很快,中间非常非常慢,又是为何?
从源码中获的了一些猜想
LinkedList首先要找到位置为index的那个node然后把要插入的element放在它的前边,在寻找node的过程先判断index是在前半段还是后半段,在前半段的话从first往后找,在后半段的话从last往前找。那么如果index在中间位置的话,查找速度必然最慢。那么再回头看看数据里的两端快,中部慢现象。所以查找node节点的过程应该造成了更多的开销。