打字猴:1.700444056e+09
1700444056
1700444057 //列表长度减1
1700444058
1700444059 size—;
1700444060
1700444061 //修改计数器+1
1700444062
1700444063 modCount++;
1700444064
1700444065 return result;
1700444066
1700444067 }
1700444068
1700444069 这也是双向链表的标准删除算法,没有任何耗时的操作,全部是引用指针的变更,效率自然高了。
1700444070
1700444071 在实际测试中得知,处理大批量的删除动作,LinkedList比ArrayList快40倍以上。
1700444072
1700444073 (3)修改元素
1700444074
1700444075 写操作还有一个动作:修改元素值,在这一点上LinkedList输给了ArrayList,这是因为LinkedList是顺序存取的,因此定位元素必然是一个遍历过程,效率大打折扣,我们来看set方法的代码:
1700444076
1700444077 public E set(int index, E element){
1700444078
1700444079 //定位节点
1700444080
1700444081 Entry<E>e=entry(index);
1700444082
1700444083 E oldVal=e.element;
1700444084
1700444085 //节点的元素替换
1700444086
1700444087 e.element=element;
1700444088
1700444089 return oldVal;
1700444090
1700444091 }
1700444092
1700444093 看似很简洁,但是这里使用了entry方法定位元素,在上一个建议中我们已经说明了LinkedList这种顺序存取列表的元素定位方式会折半遍历,这是一个极耗时的操作。而ArrayList的修改动作则是数组元素的直接替换,简单高效。
1700444094
1700444095 在修改动作上,LinkedList比ArrayList慢很多,特别是要进行大量的修改时,两者完全不在一个数量级上。
1700444096
1700444097 上面通过分析源码完成了LinkedList与ArrayList之间的PK,其中LinkedList胜两局:删除和插入效率高;ArrayList胜一局:修改元素效率高。总体上来说,在“写”方面,LinkedList占优势,而且在实际使用中,修改是一个比较少的动作。因此,如果有大量的写操作(更多的是插入和删除动作),推荐使用LinkedList。不过何为少量,何为大量呢?
1700444098
1700444099 这就要依赖诸位正在开发的系统了,一个实时交易的系统,即使写作操再少,使用LinkedList也比ArrayList合适,因为此类系统是争分夺秒的,多N个毫秒可能就会造成交易数据不准确;而对于一个批量系统来说,几十毫秒、几百毫秒,甚至是几千毫秒的差别意义都不大,这时是使用LinkedList还是ArrayList就看个人爱好了,当然,如果系统已经处于性能临界点了那就必须使用LinkedList。
1700444100
1700444101 且慢,“写”操作还有一个增加(add方法)操作,为什么这里没有PK呢?那是因为两者在增加元素时性能上基本没有什么差别,区别只是在增加时LinkedList生成了一个Entry元素,其previous指向倒数第二个Entry, next置空;而ArrayList则是把元素追加到了数组中而已,两者的性能差别非常微小,不再讨论。
1700444102
1700444103
1700444104
1700444105
[ 上一页 ]  [ :1.700444056e+09 ]  [ 下一页 ]