分析测试
新增元素操作性能测试
测试用例源代码:
ArrayList:https://paste.ubuntu.com/p/gktBvjgMGk/
LinkedList:https://paste.ubuntu.com/p/3jQrY2XMPr/
测试结果:
通过这组测试,我们可以知道LinkedList添加元素的效率未必要高于ArrayList。
从集合头部位置添加元素
由于ArrayList是数组实现的,在添加元素到数组头部的时候,需要对头部以后的数据进行复制重排,所以效率很低;
LinkedList是基于链表实现,在添加元素的时候,首先会通过循环查找到添加元素的位置,如果要添加的位置处于List的前半段,就从前往后找;若其位置处于后半段,就从后往前找,因此LinkedList添加元素到头部是非常高效的。
从集合中间位置位置添加元素
ArrayList在添加元素到数组中间时,同样有部分数据需要复制重排,效率也不是很高;
LinkedList将元素添加到中间位置,是添加元素最低效率的,因为靠近中间位置,在添加元素之前的循环查找是遍历元素最多的操作。
从集合尾部位置添加元素
而在添加元素到尾部的操作中,在没有扩容的情况下,ArrayList的效率要高于LinkedList。
这是因为ArrayList在添加元素到尾部的时候,不需要复制重排数据,效率非常高。
LinkedList虽然也不用循环查找元素,但LinkedList中多了new对象以及变换指针指向对象的过程,所以效率要低于ArrayList。
注意:这是排除动态扩容数组容量的情况下进行的测试,如果有动态扩容的情况,ArrayList的效率也会降低。
删除元素操作性能测试
ArrayList和LinkedList删除元素操作测试的结果和添加元素操作测试的结果很接近!
结论:如果需要在List的头部进行大量的插入、删除操作,那么直接选择LinkedList。否则,ArrayList即可。
遍历元素操作性能测试
测试用例源代码:
ArrayList:https://paste.ubuntu.com/p/ZNWc9H2pYm/
LinkedList:https://paste.ubuntu.com/p/xSk4nHDHvN/
测试结果:
我们可以看到,LinkedList的for循环性能是最差的,而ArrayList的for循环性能是最好的。
这是因为LinkedList基于链表实现的,在使用for循环的时候,每一次for循环都会去遍历半个List,所以严重影响了遍历的效率;ArrayList则是基于数组实现的,并且实现了RandomAccess接口标志,意味着ArrayList可以实现快速随机访问,所以for循环效率非常高。
LinkedList的迭代循环遍历和ArrayList的迭代循环遍历性能相当,也不会太差,所以在遍历LinkedList时,我们要切忌使用for循环遍历。