Java中List效率的比较

Java Collections Framework(JCF) 是Java SE中一个基本的类集,几乎所有的项目都会用到,其中的List 则是JCF中最最常用的一个接口。围绕List 接口,有很多实现,诸如常用的ArrayList 、LinkedList 、Vector 、Stack ,还有Java5之后引入的CopyOnWriteArrayList ,也有不少List 的开源实现,如Apache commons-collections中的各类List 
  这么多的List 实现,如何选择?他们的运行效率具体怎样?本篇文章将用具体的代码来检测其中最最常用的一些List 实现 

主要测试对象: 
  java.util.ArrayList; 
  java.util.LinkedList; 
  java.util.Stack; 
  java.util.Vector; 
  java.util.concurrent.CopyOnWriteArrayList; 
  org.apache.commons.collections.FastArrayList; 
  org.apache.commons.collections.list.TreeList; 
测试用例: 
  1.测试List 
   1.1顺序添加 
   1.2随机插入 
   1.3随机删除 
   1.4随机访问 
   1.5随机更新 
   1.5顺序迭代 
      1.6for顺序迭代 

  2.测试List 在三种情况下的排序效率 
   2.1初始时List 中元素已从小到大有序排列(最优情况) 
   2.2初始时List 中元素已从大到小有序排列(最差情况) 
   2.3初始时List 中元素随机排列,无序 
  3.测试List 互相转换的效率 
   3.1转化为TreeList 
   3.2转化为ArrayList 
   3.3转化为LinkedList 
   3.4转化为CopyOnWriteArrayList 
   3.5转化为Vector 
测试代码: 
Java代码   收藏代码
  1. import static java.lang.System.out;    
  2. import java.util.ArrayList;    
  3. import java.util.Collections;    
  4. import java.util.Iterator;    
  5. import java.util.LinkedList;    
  6. import java.util.List;    
  7. import java.util.Stack;    
  8. import java.util.Vector;    
  9. import java.util.concurrent.CopyOnWriteArrayList;    
  10. import org.apache.commons.collections.FastArrayList;    
  11. import org.apache.commons.collections.list.TreeList;    
  12. import org.apache.commons.lang.StringUtils;    
  13. import org.apache.commons.lang.time.StopWatch;    
  14. @SuppressWarnings("unchecked")    
  15. public class ListPerformance {    
  16.     public static void main(String[] args) {    
  17.         ListPerformance test = new ListPerformance(10 * 10000);    
  18.         out.print(StringUtils.center("Test List Performance: loop=" + test.loop, 80'-'));    
  19.         out.printf("\n ssssssss""""add""insert""remove""get""set",    
  20.                 "iterator","for");    
  21.         test.benchmark(new FastArrayList());    
  22.         test.benchmark(new TreeList());    
  23.         test.benchmark(new ArrayList());    
  24.         test.benchmark(new LinkedList());    
  25.         test.benchmark(new CopyOnWriteArrayList());    
  26.         test.benchmark(new Vector());    
  27.         test.benchmark(new Stack());    
  28.         //2.测试排序    
  29.         out.print("\n\n");    
  30.         out.print(StringUtils.center("Test List sort Performance: loop=" + test.loop, 80'-'));    
  31.         out.printf("\n ssss""""optimize""worst""random");    
  32.         test.benchmarkSort(new FastArrayList());    
  33.         test.benchmarkSort(new TreeList());    
  34.         test.benchmarkSort(new ArrayList());    
  35.         test.benchmarkSort(new LinkedList());    
  36.         //test.benchmarkSort(new CopyOnWriteArrayList());//UnsupportedOperationException    
  37.         test.benchmarkSort(new Vector());    
  38.         test.benchmarkSort(new Stack());    
  39.         //3.测试各种数据结构间转化    
  40.         out.print("\n\n");    
  41.         out.print(StringUtils.center("Test List convert Performance: loop=" + test.loop, 80'-'));    
  42.         out.printf("\n ssssss""""Tree""Array""Linked""CopyOnWrite",    
  43.                 "Vector");    
  44.         test.benchmarkConvert(new FastArrayList());    
  45.         test.benchmarkConvert(new TreeList());    
  46.         test.benchmarkConvert(new ArrayList());    
  47.         test.benchmarkConvert(new LinkedList());    
  48.         test.benchmarkConvert(new CopyOnWriteArrayList());    
  49.     }    
  50.        
  51.     private int loop = 10000;    
  52.     public ListPerformance(int loop) {    
  53.         this.loop = loop;    
  54.     }    
  55.     public void benchmark(List list) {    
  56.         out.printf("\n s", list.getClass().getSimpleName());    
  57.         int j;    
  58.         StopWatch watch = null;    
  59.         //1.测试顺序性能(Add)    
  60.         (watch = new StopWatch()).start();    
  61.         for (int i = 0; i < loop; i++) {    
  62.             list.add(new Integer(i));    
  63.         }    
  64.         watch.stop();    
  65.         out.printf("d", watch.getTime());    
  66.         //2.测试随机插入性能(Random insert)    
  67.         (watch = new StopWatch()).start();    
  68.         for (int i = 0; i < loop; i++) {    
  69.             j = (int) (Math.random() * loop);    
  70.             list.add(j, new Integer(-j));    
  71.         }    
  72.         watch.stop();    
  73.         out.printf("d", watch.getTime());    
  74.         //3.测试随机索引删除(Random remove)    
  75.         (watch = new StopWatch()).start();    
  76.         for (int i = 0; i < loop; i++) {    
  77.             j = (int) (Math.random() * loop);    
  78.             list.remove(j);    
  79.         }    
  80.         watch.stop();    
  81.         out.printf("d", watch.getTime());    
  82.         //4.测试随机取数性能(Random get)    
  83.         (watch = new StopWatch()).start();    
  84.         for (int i = 0; i < loop; i++) {    
  85.             j = (int) (Math.random() * loop);    
  86.             list.get(j);    
  87.         }    
  88.         watch.stop();    
  89.         out.printf("d", watch.getTime());    
  90.         //5.测试随机更新性能(Random set)    
  91.         (watch = new StopWatch()).start();    
  92.         for (int i = 0; i < loop; i++) {    
  93.             j = (int) (Math.random() * loop);    
  94.             list.set(j, j);    
  95.         }    
  96.         watch.stop();    
  97.         out.printf("d", watch.getTime());    
  98.         //6.测试迭代性能(Iterator)    
  99.         (watch = new StopWatch()).start();    
  100.         Iterator<Object> iter = list.iterator();    
  101.         while (iter.hasNext()) {    
  102.             iter.next();    
  103.         }    
  104.         watch.stop();    
  105.         out.printf("d", watch.getTime());  
  106.       //7.测试迭代性能(Iterator)    
  107.         (watch = new StopWatch()).start();    
  108.      //   Iterator<Object> iter = list.iterator();    
  109.         for (Object obj : list) {    
  110.             
  111.         }    
  112.         watch.stop();    
  113.         out.printf("d", watch.getTime());  
  114.     }    
  115.     public void benchmarkConvert(List list) {    
  116.         out.printf("\n s", list.getClass().getSimpleName());    
  117.         StopWatch watch = null;    
  118.         //1.转TreeList    
  119.         (watch = new StopWatch()).start();    
  120.         new TreeList(list);    
  121.         watch.stop();    
  122.         out.printf("d", watch.getTime());    
  123.         //2.转ArrayList    
  124.         (watch = new StopWatch()).start();    
  125.         new ArrayList(list);    
  126.         watch.stop();    
  127.         out.printf("d", watch.getTime());    
  128.         //3.转LinkedList    
  129.         (watch = new StopWatch()).start();    
  130.         new LinkedList(list);    
  131.         watch.stop();    
  132.         out.printf("d", watch.getTime());    
  133.         //4.转CopyOnWriteArrayList    
  134.         (watch = new StopWatch()).start();    
  135.         new CopyOnWriteArrayList(list);    
  136.         watch.stop();    
  137.         out.printf("d", watch.getTime());    
  138.         //5.转Vector    
  139.         (watch = new StopWatch()).start();    
  140.         new Vector(list);    
  141.         watch.stop();    
  142.         out.printf("d", watch.getTime());    
  143.     }    
  144.     public void benchmarkSort(List list) {    
  145.         out.printf("\n s", list.getClass().getSimpleName());    
  146.         StopWatch watch = null;    
  147.         //1.顺序List    
  148.         for (int i = 0; i < loop; i++) {    
  149.             list.add(new Integer(i));    
  150.         }    
  151.         (watch = new StopWatch()).start();    
  152.         Collections.sort(list);    
  153.         watch.stop();    
  154.         out.printf("d", watch.getTime());    
  155.         //2.逆序List    
  156.         for (int i = loop - 1; i > 0; i--) {    
  157.             list.add(new Integer(i));    
  158.         }    
  159.         (watch = new StopWatch()).start();    
  160.         Collections.sort(list);    
  161.         watch.stop();    
  162.         out.printf("d", watch.getTime());    
  163.         //3.随机顺序List    
  164.         for (int i = 0, j = 0; i < loop; i++) {    
  165.             j = (int) (Math.random() * loop);    
  166.             list.add(new Integer(j));    
  167.         }    
  168.         (watch = new StopWatch()).start();    
  169.         Collections.sort(list);    
  170.         watch.stop();    
  171.         out.printf("d", watch.getTime());    
  172.     }    
  173. }   




测试结果: 
-----------------------Test List Performance: loop=100000----------------------- 
                           add    insert    remove       get       set  iterator       for 
       FastArrayList        31     16344     16312        47        62         0         0 
            TreeList       156       391       281       109       110        15         0 
           ArrayList        47     16406     16500        16        47        16         0 
          LinkedList        15    149719    264203    176125    179406         0        31 
CopyOnWriteArrayList     27422    141797    160906        31     65375         0         0 
              Vector        16     26391     24437        31        47        16         0 
               Stack        31     25094     22703        31        16        16         0 
--------------------Test List sort Performance: loop=100000--------------------- 
                      optimize     worst    random 
       FastArrayList        31        78       188 
            TreeList        32        94       343 
           ArrayList        16        94       172 
          LinkedList        16       266       219 
              Vector        15        78       219 
               Stack        15        94       156 
-------------------Test List convert Performance: loop=100000------------------- 
                          Tree     Array    LinkedCopyOnWrite    Vector 
       FastArrayList         0         0         0         0         0 
            TreeList         0         0         0         0         0 
           ArrayList         0         0         0         0         0 
          LinkedList         0         0         0         0         0 
CopyOnWriteArrayList         0         0         0         0         0
 





结论: 
  1.随机插入、随机删除操作中,用TreeList 效率最高; 
  2.在只需要追加、迭代的环境下,LinkedList 效率最高; 
  3.平均效率来讲,ArrayList 相对平衡,但如果海量随机操作,还是会造成性能瓶颈; 
  4.CopyOnWriteArrayList 因为线程安全的原因,致使性能降低很多,所以慎用; 
  5.Vector 没有传说中那么低的效率; 
  6.让Stack 来做List 的事可以,不过语义上Stack 不应该做过多的List 的事情; 
  7.在排序中,ArrayList 具有最好的性能,TreeList 平均性能也不错,LinkedList 的排序效率受元素初始状态的影响很大。 
  8.各种List 间转换几乎没有时间损耗。 

注:增强性for循环其实是对iterator循环的一种简单写法,在编译时增强性for循环会被编译为iterator的for循环写法。在测试结果中两者变现出来的性能有一点相差(不正确,有时变现的快,有时变现的慢一点,可能与其他因素有关系),从理论上说,应该基本一样。 
引用地址:http://ldbjakyo.iteye.com/blog/1142899

http://blog.sina.com.cn 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值