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