插入刪除,鏈表真的比數組快嘛?

今天看到吧友發了個帖子,叫 想編寫優美的java代碼格式要記住這幾條規則
其中有一條,叫做
ArrayList底層是使用數組實現的,因此隨機讀取數據會比LinkedList快很多,而LinkedList是使用鏈表實現的,新增和刪除數據的速度比ArrayList快不少。


這句話當然木有問題啦,在提出帖子標題的時候,樓主也想罵自己是逗比。不過想想,似乎在日常寫代碼的時候,伴隨“新增和刪除”之前的操作,往往是“隨機訪問”(如果是因爲我代碼量少產生的錯覺,各位大牛勿噴)


既然這樣,那麼LinkedList真比ArrayList快嘛?


換句話說,
隨機訪問+數組元素複製 VS 尋址+插入刪除 哪個更快?
忽略掉那一個元素,也就是元素的複製和尋址,哪個更快?

package test2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Random;

public class Array_link {

	public static void main(String[] args)
	{
		long arrListTime = 0 ;
		long linkListTime = 0 ;
		Integer[] ia1 = new Integer[1000000];
		for(int i= 0;i<1000000;i++)
		{
			ia1[i] = i;
		}
		
		Random random = new Random();
		ArrayList array = new ArrayList<Integer>(Arrays.asList(ia1));
		LinkedList link = new LinkedList<Integer>(Arrays.asList(ia1));
		
		
		for(int i=0;i<10000;i++)
		{
			int r = random.nextInt(array.size());
			
			long arrTime = System.currentTimeMillis();
			array.remove(r);
			arrListTime =arrListTime + System.currentTimeMillis() - arrTime;
			
			long linkTime = System.currentTimeMillis();
			link.remove(r);
			linkListTime =linkListTime + System.currentTimeMillis() - linkTime;
			
		}
		
	
		System.out.println("ArrayList time-consuming:"+ arrListTime);
		System.out.println("LinkedList time-consuming:"+ linkListTime);
	}
}

結果爲
ArrayList time-consuming:9280
LinkedList time-consuming:40693

100W個數字裏隨機刪除1W個數字,數組更快

1.一方面是arraycopy爲本地的方法,另一方面相鄰連續內存的複製要比尋址快
2.當單個元素的數據量增大,數組將顯著變慢
發佈了33 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章