论坛首页 入门技术论坛

论ArrayList与LinkedList的读取和存储速度优势与理论不符

浏览 3280 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-28  

论ArrayList与LinkedList的读取和存储速度优势


课题内容:


ArryList 与 LinkedList的速度比较(每组4个值,取其平均数):
在存储999999个值时:ArrayList平均每储存一个值的时间是:4.3000043000043e-4
                                 LinkedList平均每储存一个值的时间是:8.542508542508543e-4


也就是说,平均每储存一个数据ArrayList仅仅是LinkedList时间的50.337%。

 在读取时:            ArrayList平均每读取一个值的时间是:5.000005000005e-6
                          LinkedList平均每读取一个值的时间是:4.55000455000455e-5


也就是说,平均每检查一个数据ArrayList仅仅是LinkedList时间的40.42%。


这样一来证明结果和理论中的ArrayList的读取速度优于LinkedList与实验结果相符合,而存储速度却也是小于Linked,这与结论相驳。小弟在这里求解释!

 


ArrayList:
------------------------------------------------------------------------------------------                       import java.util.*;
public class test {

 

 



 public static void main(String[] args) {

  GregorianCalendar d = new GregorianCalendar();
  //定义变量存储开始的时间
  int startMinute;
  int startSecond;
  //定义变量存储结束的时间
  int endMinute;
  int endSecond;
  //声明
  ArrayList arr = new ArrayList();
  startMinute = d.get(Calendar.MINUTE);
  startSecond = d.get(Calendar.SECOND);
  System.out.println("The function start at "+startMinute+" 分 "+startSecond+"秒");
  for(int i = 0;i<999999;i++){
   arr.add(i);
  }
  boolean check =arr.contains(999999);
  endMinute = d.get(Calendar.MINUTE);
  endSecond = d.get(Calendar.SECOND);
  System.out.println(check);
  System.out.println("The function over at "+startMinute+" 分 "+startSecond+"秒");
 }
}
------------------------------------------------------------------------------------------

结果:
The function start at 51 分 43秒
true
The function over at 51 分 43秒
然而将ArrayList换成LinkedList后,结果还是:
The function start at 12 分 0秒
false
The function over at 12 分 0秒
下面,我决定将时间单位换以毫秒:
结果:
The function start at 21 分 599毫秒
false
The function over at 21 分 599毫秒
是的,结果还是没有变!那么,就用微秒为单位吧。
———————————————————————————————————import java.util.*;
import java.text.*;
public class test {

 public static void main(String[] args) {
  SimpleDateFormat change = new SimpleDateFormat();
  GregorianCalendar d = new GregorianCalendar();
  
  //定义变量存储开始的时间
  int startMinute;
  int startSecond;
  //定义变量存储结束的时间
  int endMinute;
  int endSecond;
  //声明
  ArraydList arr = new ArrayList();
  startMinute = d.get(Calendar.MINUTE);
  startSecond = d.get(Calendar.MILLISECOND);
  long begintime = System.currentTimeMillis();
  System.out.println(begintime);
  for(long i = 0;i<999999;i++){
   arr.add(i);
  }
  //boolean check =arr.contains(0);
  endMinute = d.get(Calendar.MINUTE);
  endSecond = d.get(Calendar.MILLISECOND);
  //System.out.println(check);
  long endtime = System.currentTimeMillis();
  System.out.println(endtime);
 }
}
————————————————————————————————————————
存储999999个数据的速度差是:平均值430微秒左右
1306481305308
差420微秒
1306481305728
-------------------------------------
1306481498752
差430微秒
1306481499182
------------------------------------
1306481591170
差470微秒
1306481591640
-----------------------------------
1306481646002
差400微秒
1306481646402
-----------------------------------
读取速度是:平均值减去430,其速度约5微秒左右
1306481432303
false
1306481432713
相差
410微秒
---------------------------
1306481763388
false
1306481763848
相差
460微秒
-------------------------
1306481807328
false
1306481807748
相差
420微秒
-------------------------
1306481837805
false
1306481838255
相差
450微秒
下面将代码中的ArrayList换成LinkedList进行比较:
存储999999个数据的速度差是:平均值854.25微秒左右
1306506487995
相差842微秒
1306506488837
------------------------------------
1306506678282
相差905微秒
1306506679187
-------------------------------------
1306506727408
相差796微秒
1306506728204
-------------------------------------
1306506815675
相差847微秒
1306506816549
--------------------------------------
下面加上查找功能:平均值减去854.25,其速度约45.5微秒左右
1306506923287
false
1306506924145
相差
858微秒
--------------------------------------
1306507030742
false
1306507031647
相差
905微秒
--------------------------------------
1306507072115
false
1306507073051
相差
936微秒
------------------------------------------
1306507171733
false
1306507172633
相差
900微秒

   发表时间:2011-12-06  
居然  没人回复。。。。。。

wo 也遇到这个问题了。
但有 背景, 我是向ArrayList 和 LinkedList 分别随即位置插入 10w条数据时
Linked 快

但在已有的10w条List里再随即位置插入10w条
发现  Array 比Linked 快多了, 我也很疑惑


希望有高人求解  我昏厥了。
0 请登录后投票
   发表时间:2011-12-29  

这么长时间居然都没人回...ie看来真是不行了。
因为LZ用的是add(i),这个是直接加到List的末尾,对于ArrayList不用移动元素直接插入就可以,对于LinkedList需要现找到最后一个元素,再插入,所以LinkedList会慢。
如果是用add(0,i),每次将元素插入到最前面,结果就不一样了。
代码如下

import java.util.*;

public class test {
	public static void main(String[] args) {
		testAdd();
	}

	public static void testAdd() {
		final int COUNT = 100000;
		// 取程序运行的精确时间要用这个方法
		long start, end;

		// LinkedList
		start = System.currentTimeMillis();
		LinkedList<Integer> linkedList = new LinkedList<Integer>();
		for (int i = 0; i < COUNT; i++) {
			linkedList.add(0, i);
		}
		end = System.currentTimeMillis();
		System.out.println("LinkedList程序运行时间" + ((float) (end - start) / 1000)
				+ "秒");

		// ArrayList
		start = System.currentTimeMillis();
		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		for (int i = 0; i < COUNT; i++) {
			arrayList.add(0, i);
		}
		end = System.currentTimeMillis();
		System.out.println("ArrayList程序运行时间" + ((float) (end - start) / 1000)
				+ "秒");
	}
}

 输出结果如下

LinkedList程序运行时间0.037秒
ArrayList程序运行时间3.216秒

 

0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics