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;
1700444040
1700444041
//前节点next指向当前节点的next
1700444042
1700444043
e.previous.next=e.next;
1700444044
1700444045
//后节点的previouse指向当前节点的previous
1700444046
1700444047
e.next.previous=e.previous;
1700444048
1700444049
//置空当前节点的next和previous
1700444050
1700444051
e.next=e.previous=null;
1700444052
1700444053
//当前元素置空
1700444054
1700444055
e.element=null;
1700444056
1700444057
//列表长度减1
1700444058
1700444059
size—;
1700444060
1700444061
//修改计数器+1
1700444062
1700444063
modCount++;
1700444064
1700444065
return result;
1700444066
1700444067
}
1700444068
1700444069
这也是双向链表的标准删除算法,没有任何耗时的操作,全部是引用指针的变更,效率自然高了。
[
上一页 ]
[ :1.70044402e+09 ]
[
下一页 ]