1700443921
编写高质量代码:改善Java程序的151个建议 建议68:频繁插入和删除时使用LinkedList
1700443922
1700443923
上一个建议介绍了列表的遍历方式,也就是“读”操作,本建议将介绍列表的“写”操作:即插入、删除、修改动作。
1700443924
1700443925
(1)插入元素
1700443926
1700443927
列表中我们使用最多的是ArrayList,下面来看看它的插入(add方法)算法,源代码如下:
1700443928
1700443929
public void add(int index, E element){
1700443930
1700443931
/*检查下标是否越界,代码不再拷贝*/
1700443932
1700443933
//若需要扩容,则增大底层数组的长度
1700443934
1700443935
ensureCapacity(size+1);
1700443936
1700443937
//给index下标之后的元素(包括当前元素)的下标加1,空出index位置
1700443938
1700443939
System.arraycopy(elementData, index, elementData, index+1,size-index);
1700443940
1700443941
//赋值index位置元素
1700443942
1700443943
elementData[index]=element;
1700443944
1700443945
//列表长度+1
1700443946
1700443947
size++;
1700443948
1700443949
}
1700443950
1700443951
注意看arraycopy方法,只要是插入一个元素,其后的元素就会向后移动一位,虽然arraycopy是一个本地方法,效率非常高,但频繁的插入,每次后面的元素都要拷贝一遍,效率就变低了,特别是在头位置插入元素时。现在的问题是,开发中确实会遇到要插入元素的情况,那有什么更好的方法解决此效率问题吗?
1700443952
1700443953
有,使用LinkedList类即可。我们知道LinkedList是一个双向链表,它的插入只是修改相邻元素的next和previous引用,其插入算法(add方法)如下:
1700443954
1700443955
public void add(int index, E element){
1700443956
1700443957
addBefore(element,(index==size?header:entry(index)));
1700443958
1700443959
}
1700443960
1700443961
这里调用了私有addBefore方法,该方法实现了在一个元素之前插于元素的算法,代码如下:
1700443962
1700443963
private Entry<E>addBefore(E e, Entry<E>entry){
1700443964
1700443965
//组装一个新节点,previous指向原节点的前节点,next指向原节点
1700443966
1700443967
Entry<E>newEntry=new Entry<E>(e, entry, entry.previous);
1700443968
1700443969
//前节点的next指向自己
[
上一页 ]
[ :1.70044392e+09 ]
[
下一页 ]