頻繁插入和刪除時使用LinkedList

2021-09-22 09:55:31 字數 2246 閱讀 7014

一、分析

前面有文章分析了列表的表裡方式,也就是「讀」的操作。本文將介紹表的「寫」操作:即插入、刪除、修改動作。

二、場景

1.插入元素

列表中我們使用最多的是arraylist,下面看看他的插入(add方法)演算法,源**如下:

1

public

void add(int

index,e element)

12 }

注意看arraycopy方法,只要是插入乙個元素,其後的元素就會向後移動一位,雖然arraycopy是乙個本地方法,效率非常高,但頻繁的插入,每次後面的元素都需要拷貝一遍,效率變低了,特別是在頭位置插入元素時。

現在的問題是,開發中確實會遇到要插入元素的情況,那有什麼更好的方法來解決此效率問題嗎?

有....使用linkedlist類即可,我們知道,linkedlist是乙個雙向鍊錶,它的插入只是修改相鄰元素的next和previous引用,其插入演算法(add方法)如下:

1

public

void add(int

index,e element)

這裡呼叫了私有的addbefore方法,改方法實現了在乙個元素之前插入元素的演算法,**如下:

1

private

entry addbefore(e e,entry entry)

這是乙個典型的雙向鍊錶的插入演算法,把自己插入到鍊錶,然後把前節點的next和後節點的previous指向自己。這樣乙個插入元素(也就是乙個entry物件)的過程中,沒有任何元素會有拷貝過程,只是引用位址改變了.效率當然就高了.

經過實際測試得知,linkedlist的插入效率比arraylist快50倍以上.

(2)刪除元素

arraylist刪除指定位置上的元素、刪除指定值元素,刪除乙個下標範圍內的元素集等刪除動作,三者的實現原理基本相似,都是找到索引位置,然後刪除。我偶們常用的刪除下標的方法(remove方法)為例來看看刪除動作的效能到底如何,原始碼如下:

1

public e remove(int

index)

注意看,index位置後的元素都向前移動了一位,最後乙個位置空出來了,這又是一次陣列拷貝,和插入一樣,如果資料量大,刪除動作必然會暴露出效能和效率方面的問題。

我們再來看看linkedlist的刪除動作,比如刪除指定位置元素,刪除頭元素等。我們看看最基本的刪除指定位置元素的方法remove,源**如下:

1

private

e remove(entry e)

這也是雙向鍊錶的標準刪除演算法,沒有任何耗時的操作,全部是引用指標的改變,效率自然就更高了。

實際測試可知,處理大批量的刪除操作,linkedlist比arraylist塊40倍以上。

(3)修改元素

寫操作還有乙個動作:修改元素,在這點上linkedlist輸給了arraylist,這是因為,linkedlist是順序訪問的,因此定位元素必然是乙個遍歷的過程,效率大大折扣。

我們來開set方法的**:

1

public e set(int

index,e element)

看似很簡潔,這裡使用了entry方法定位元素。而linkedlist這種順序取列表的元素定位方式會折半遍歷,這是乙個極其耗時的操作。而arraylist的修改動作則是陣列元素的直接替換,簡單高效。

在修改動作上,linkedlist比arraylist慢的多,特別是進行大量修改的時候,完全不是在乙個數量級上。

上面通過源**分析完成了arraylist和linkedlist之間的pk,其中linkedlist勝兩局:刪除和插入效率更高;arraylist勝一局,修改效率更高.

總體上來說,在"寫"方面linkedlist佔優勢,而且在實際使用中,修改上乙個比較少的動作.因此,如果有大量寫的操作(更多的是插入和刪除操作),推薦使用linkedlist.

不過何為少量,何為大量..

這就需要依賴於開發的系統了..乙個實時的交易系統,即使寫的操作再少,使用linkedlist也比arraylist合適.因為此類系統是爭分奪秒的,多n個毫秒可能就會造成交易資料的不準確.

而對於乙個批量系統來說,幾十毫秒,幾百毫秒,甚至是幾千毫秒的差別和意義都不大,這時候使用linkedlist和arraylist就看個人的愛好了,當然,如果系統已經處於效能臨界點了那就必須使用linkedlist.

Vim 插入和刪除

1 定位游標 2 ctrl v 進入visual mode。3 j 選擇要在哪列插入 4 i 一定是大寫!5 輸入要插入的文字 6 esc x 刪除當前游標下的字元 dw 刪除游標之後的單詞剩餘部分。d 刪除游標之後的該行剩餘部分。dd 刪除當前行。set foldmethod syntax 關閉摺...

std vector插入和刪除高階

std vectorexamplevec 1.iterator erase const iterator pos 移除位於 pos的元素 注意點 1 迭代器 pos必須合法且可解引用。所以 不能以end 迭代器為 pos的值 合法,但不可解引用 不然會拋異常。比如 examplevec.erase ...

C STLlist容器插入和刪除

功能描述 對list容器進行資料的插入和刪除 函式原型 push back elem 在容器尾部加入乙個元素 pop back 刪除容器最後乙個元素 push fron elem 在容器開頭插入乙個元素 pop front 從容器中移除第乙個容器 insert pos,elem 在pos位置插入el...