ArrayList与LinkedList的谬论

对数据进行修改的时候使用链表可以直接在指定的位置实现删除、插入操作,不需要像数组那样还要移动数组中的数据,而实现数据直接访问的时候使用数组的就可以直接的找到目的地址,不像链表一样需要从头到尾的寻找。

所以很多人认为在数据的插入、删除的时候链表的效率要比数组的高,因为他不需要数组的频繁的移动数据,但是这几天看到一篇文章说是其实数组的效率还是比较高的,因为他在数据移动的时候是在内存中并且相邻,数据移动就会非常的快。而链表需要从前到后找到数据然后在进行插入、删除操作。而链表在数据的遍历的时候是很费时间的。

有一个很形象的比喻就是:

插入、删除数据 数组就像是搬运工一样将东西搬到另外一个地方,而链表就像是有很多的抽屉,每一个抽屉都有下一个抽屉的钥匙,所以每一次都需要打开抽屉取出钥匙,然后再打开下一个抽屉,就这样一直下去。

但是很多人都认为搬用东西的数组肯定没有开抽屉的链表快,因为人们都无形中觉得数组搬运的东西又重距离也远,所以这就是人们觉得数组的效率很差,而链表的就很快了。但是实际并不是这样的,数组移动的距离很短而且东西也很轻,所以数组的访问还是很快的。

下面的一个例子来说明这些吧。。

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


public class Test {

 
 public static void main(String[] args) {
  int a[] = new int[5000];
  for(int i= 1 ; i< 5000;i++)
   a[i] = i;
  long start[]= new long[2] ;
  long end[] = new long[2];
  LinkedList list = new LinkedList();
  for(int i= 1 ; i< 5000;i++)
   list.add(a[i]);
  start[0] =  System.currentTimeMillis();
  Random r = new Random();
  for(int i=0;i<10000;i++)
  {
   list.add(r.nextInt(5000),i);
  }
  end[0] = System.currentTimeMillis();
  ArrayList list2 = new ArrayList();
  for(int i= 1 ; i< 5000;i++)
    list2.add(a[i]) ;
  start[1] = System.currentTimeMillis();
  for(int i=0;i<10000;i++)
  {
   list2.add(r.nextInt(5000),i);
  }
  end[1] = System.currentTimeMillis();
  System.out.println("\n比较结果为:");
  System.out.println("LinkList 用的时间为:" + (end[0]- start[0]));
  System.out.println("ArrayList 用的时间为:" + (end[1]- start[1]));
 }
 
}
输出的结果为:

ArrayList与LinkedList的谬论

ArrayList与LinkedList的谬论

ArrayList与LinkedList的谬论

经过多次的测试,结果都是为ArrayList插入数据要比LinkedList要快一些,当着这里可能也有别的误差在里面。所以我们要靠自己程序进行测试才能得到相应的结论。

posted on 2012-02-26 15:57  c语言源码  阅读(310)  评论(0编辑  收藏  举报

导航