1700443990
1700443991
经过实际测试得知,LinkedList的插入效率比ArrayList快50倍以上。
1700443992
1700443993
(2)删除元素
1700443994
1700443995
插入了解清楚了,我们再来看删除动作。ArrayList提供了删除指定位置上的元素、删除指定值元素、删除一个下标范围内的元素集等删除动作,三者的实现原理基本相似,都是找到索引位置,然后删除。我们以最常用的删除指定下标的方法(remove方法)为例来看看删除动作的性能到底如何,源码如下:
1700443996
1700443997
public E remove(int index){
1700443998
1700443999
//下标校验
1700444000
1700444001
RangeCheck(index);
1700444002
1700444003
//修改计数器+1
1700444004
1700444005
modCount++;
1700444006
1700444007
//记录要删除的元素值
1700444008
1700444009
E oldValue=(E)elementData[index];
1700444010
1700444011
//有多少个元素向前移动
1700444012
1700444013
int numMoved=size-index-1;
1700444014
1700444015
if(numMoved>0)
1700444016
1700444017
//index后的元素向前移动一位
1700444018
1700444019
System.arraycopy(elementData, index+1,elementData, index, numMoved);
1700444020
1700444021
//列表长度减1,并且最后一位设为null
1700444022
1700444023
elementData[—size]=null;
1700444024
1700444025
//返回删除的值
1700444026
1700444027
return oldValue;
1700444028
1700444029
}
1700444030
1700444031
注意看,index位置后的元素都向前移动了一位,最后一个位置空出来了,这又是一次数组拷贝,和插入一样,如果数据量大,删除动作必然会暴露出性能和效率方面的问题。ArrayList其他的两个删除方法与此相似,不再赘述。
1700444032
1700444033
我们再来看看LinkedList的删除动作。LinkedList提供了非常多的删除操作,比如删除指定位置元素、删除头元素等,与之相关的poll方法也会执行删除动作,下面来看最基本的删除指定位置元素的方法remove,源代码如下:
1700444034
1700444035
private E remove(Entry<E>e){
1700444036
1700444037
//取得原始值
1700444038
1700444039
E result=e.element;
[
上一页 ]
[ :1.70044399e+09 ]
[
下一页 ]