1700443970
1700443971
newEntry.previous.next=newEntry;
1700443972
1700443973
//后节点的previous指向自己
1700443974
1700443975
newEntry.next.previous=newEntry;
1700443976
1700443977
//长度+1
1700443978
1700443979
size++;
1700443980
1700443981
//修改计数器+1
1700443982
1700443983
modCount++;
1700443984
1700443985
return newEntry;
1700443986
1700443987
}
1700443988
1700443989
这是一个典型的双向链表插入算法,把自己插入到链表,然后再把前节点的next和后节点的previous指向自己。想想看,这样一个插入元素(也就是Entry对象)的过程中,没有任何元素会有拷贝过程,只是引用地址改变了,那效率当然就高了。
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);
[
上一页 ]
[ :1.70044397e+09 ]
[
下一页 ]