ArrayList与LinkList性能对比删除元素

编程

今天接着上一篇,测试删除元素的性能

代码 码云路径

分别从 List 的头部,中间,尾部,删除下标对应的元素

1万的数量级结果如下图,耗时单位ms

head 消耗时间 arrayList>linkedList

middle 消耗时间 arrayList<linkedList

end 消耗时间 arrayList = linkedList

10万的数量级结果如下图,耗时单位ms

head 消耗时间 arrayList>linkedList

middle 消耗时间 arrayList<linkedList

end 消耗时间 arrayList < linkedList

两个量级对比,可以很明显的看出,除了头部移除元素linkedList效率高,其他的效率都是低于arrayList 的

ArrayList remove 代码如下

与add 的源码很相似

1.校验下标是否合法

2.将对数组的操作统计加1

3.计算出要复制数组长度

4.拷贝得到移除下标后的新数组

5.将数组的末位对应的元素置为null,相当于将移除下标位置,之后的所有元素都往前移一位,这也就是为什么ArrayList从头部移除数据效率很低,从头部移除元素,要复制除的也就是移动的元素最多

再看 LinkList   的删除指定下标元素的代码

1.校验下标的合法性

2.移除下标对应的节点对象

2步骤中的 node(index) 是不是很熟悉 就是Add 中的通过下标查找对应节点的方法,所以这也就是为什么中间删除元素linkList 效率最低

unlink 源码如上图

1.判断移除的下标节点,是否存在前节点,如果不存在前节点(移除的为首节点),则将首节点修改为移除下标节点的后节点,如果存在前节点,将节点的后节点对象替换,要移除节点的下一个节点

2.判读移除的下标节点,是否存在后节点,如果不存在后节点,则将尾部节点修改(移除的为尾节点),则将尾节点改为移除下标节点的前节点,如果存在后节点,将后节点的前节点对象替换为,要移除节点的前节点对象

最终的效果如下,把下标1的2节点移除,将1节点的next 节点改为3节点,把3节点的prev 节点改为1

3.步骤中把当前节点设置为null,长度-1,数组的操作统计+1

总结

arrayList 在删除指定下标的元素的时候,是通过数组复制,在复制的过程中,通过剔除了指定下标的元素,来达到删除指定下标元素的效果
linkedList 在删除指定下标的元素时,要判断下标所属位置,从而确定从头部还是尾部,查找到对应的下标节点对象,对节点对象的,前后节点的next和prev 对象进行替换

除了头部移除元素linkedList效率高,其他的效率都是低于arrayList 的

两种List 还有一种remove(Object o)  其实到最后调用的都是通过下标来移除元素的方法,刚兴趣的同学可以自己试试

 

以上是 ArrayList与LinkList性能对比删除元素 的全部内容, 来源链接: utcz.com/z/517068.html

回到顶部