打字猴:1.70044399e+09
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 ]  [ 下一页 ]