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