ArrayList和LinkedList的几种循环遍历方式及性能对比分析

上传人:夏** 文档编号:548299361 上传时间:2023-10-11 格式:DOCX 页数:10 大小:129.55KB
返回 下载 相关 举报
ArrayList和LinkedList的几种循环遍历方式及性能对比分析_第1页
第1页 / 共10页
ArrayList和LinkedList的几种循环遍历方式及性能对比分析_第2页
第2页 / 共10页
ArrayList和LinkedList的几种循环遍历方式及性能对比分析_第3页
第3页 / 共10页
ArrayList和LinkedList的几种循环遍历方式及性能对比分析_第4页
第4页 / 共10页
ArrayList和LinkedList的几种循环遍历方式及性能对比分析_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《ArrayList和LinkedList的几种循环遍历方式及性能对比分析》由会员分享,可在线阅读,更多相关《ArrayList和LinkedList的几种循环遍历方式及性能对比分析(10页珍藏版)》请在金锄头文库上搜索。

1、根据ArrayList和LinkedList的源码实现分析性能结果,总结结论。通过本文你可以了解(1)List的五种遍历方式及各自性能(2)foreach及Iterator的实现(3)加深对ArrayList和LinkedList实现的了解。阅读本文前希望你已经了解ArrayList顺序存储和LinkedList链式的构造,本文不对此进展介绍。相关:HashMap循环遍历方式及其性能比照1.List的五种遍历方式下面只是简单介绍各种遍历例如(以ArrayList为例),各自优劣会在本文后面进展分析给出结论。foreach循环Java3dIjT11 Listlist=newArrayList()

2、;2 for(Integerj:list)3 /usej4 (2)显示调用集合迭代器JavaI3山/1 Listlist=newArrayList();2 for(Iteratoriterator=list.iterator();iterator.hasNext();)3 iterator.next();4 或JavaIid/1 Listlist=newArrayList();2 Iteratoriterator=list.iterator();3 while(iterator.hasNext()4 iterator.next();5 (3)下标递增循环,终止条件为每次调用sizeO数比拟判断

3、JavaI3山/1 Listlist=newArrayList();2 for(intj=0;jlist.size();j+)3 list.get(j);4 (4)下标递增循环,终止条件为和等于size()的临时变量比拟判断JavaI3_j/1 Listlist=newArrayList();2 intsize=list.size();3 for(intj=0;jsize;j+)4 list.get(j);5 (5)下标递减循环Java1 Listlist=newArrayList();2 for(intj=list.size()-1;j=0;j-)3 list.get(j);4 在测试前大家

4、可以根据对ArrayList和LinkedList数据构造及Iterator的了解,想想上面五种遍历方式哪个性能更优。2、List五种遍历方式的性能测试及比照以下是性能测试代码,会输出不同数量级大小的ArrayList和LinkedList各种遍历方式所花费的时间。ArrayList和LinkedList循环性能比照测试代码1pareloopperformanceofArrayList23listsize|10,000|100,000|1,000,000|10,000,00045foreach|1ms|3ms|14ms|152ms67foriterator|0ms|1ms|12ms|114ms

5、89forlist.size()|1ms|1ms|13ms|128ms1011forsize=list.size()|0ms|0ms|6ms|62ms1213forj-|0ms|1ms|6ms|63ms141516pareloopperformanceofLinkedList1718listsize|100|1,000|10,000|100,0001920foreach10ms|1ms|1ms|2ms2122foriterator|0ms|0ms|0ms|2ms2324forlist.size()|0ms|1ms|73ms|7972ms2526forsize=list.size()|0ms|0

6、ms|67ms|8216ms2728forj-|0ms|1ms|67ms|8277ms29第一X表为ArrayList比照结果,第二X表为LinkedList比照结果。表横向为同一遍历方式不同大小list遍历的时间消耗,纵向为同一list不同遍历方式遍历的时间消耗。PS:由于首次遍历List会稍微多耗时一点,foreach的结果稍微有点偏差,将测试代码中的几个Type顺序调换会发现,foreach耗时和fo门terator接近。3、遍历方式性能测试结果分析(1)foreach介绍foreach是JavaSE5.0H入的功能很强白循环构造,for(Integerj:list)应读作foreach

7、intinlist。for(Integerj:list)实现几乎等价于JavaI3山/1 Iteratoriterator=list.iterator();2 while(iterator.hasNext()3 Integerj=iterator.next();4 下面的分析会将foreach和显示调用集合迭代器两种遍历方式归类为Iterator方式,其他三种称为get方式遍历。这时我们已经发现foreach的一大好处,简单一行实现了四行的功能,使得代码简洁美观,另一大好处是相对于下标循环而言的,foreach不必关心下标初始值和终止值及越界等,所以不易出错。Effective-Java中推荐

8、使用此种写法遍历,本文会验证这个说法。使用foreach构造的类对象必须实现了Iterable接口,Java的Collection继承自此接口,List实现了Collection,这个接口仅包含一个函数,源码如下:Javaad/1 packagejava.lang;23 importjava.util.Iterator;45 /*6 *Implementingthisinterfaceallowsanobjecttobethetargetof7 *theforeachstatement.8 *9 *paramthetypeofelementsreturnedbytheiterator10 *1

9、1 *since1.512 */13 publicinterfaceIterable1415 /*16 *ReturnsaniteratoroverasetofelementsoftypeT.17 *18 *returnanIterator.19 */20 Iteratoriterator。;21 iterator。用于返回一个Iterator,从foreach的等价实现中我们可以看到,会调用这个函数得到Iterator,再通过Iterator的next()得到下一个元素,hasNext()判断是否还有更多元素。Iterator源码如下:JavaI5,11jT11 publicinterfac

10、eIterator2 booleanhasNext();34 Enext();56 voidremove();7 (2)ArrayList遍历方式结果分析1pareloopperformanceofArrayList23listsize|10,000|100,000|1,000,000|10,000,00045foreach|1ms|3ms|14ms|152ms67foriterator|0ms|1ms|12ms|114ms89forlist.size()|1ms|1ms|13ms|128ms1011forsize=list.size()|0ms|0ms|6ms|62ms1213forj-|0

11、ms|1ms|6ms|63ms14PS:由于首次遍历List会稍微多耗时一点,foreach的结果稍微有点偏差,将测试代码中的几个Type顺序调换会发现,foreach耗时和fo门terator接近。从上面我们可以看出:a.在ArrayList大小为十万之前,五种遍历方式时间消耗几乎一样b.在十万以后,第四、五种遍历方式快于前三种,get方式优于Iterator方式,并且Java3山/1 intsize=list.size();2 for(intj=0;jsize;j+)3 list.get(j);4 用临时变量size取彳弋list.size()f生能更优。我们看看ArrayList中迭代器

12、Iterator和get方法的实现Java1privateclassItrimplementsIterator2 intcursor;/indexofnextelementtoreturn3 intlastRet=-1;/indexoflastelementreturned;-1ifnosuch4 intexpectedModCount=modCount;56 publicbooleanhasNext()7 returncursor!=size;8 910 SuppressWarnings(unchecked)11 publicEnext()12 checkForodification();1

13、3 inti=cursor;14 if(i=size)15 thrownewNoSuchElementException();16 Object口elementData=ArrayList.this.elementData;17 if(i=elementData.length)18 thrownewConcurrentModificationException();19 cursor=i+1;20 return(E)elementDatalastRet=i;21 2223 2425 publicEget(intindex)26 rangeCheck(index);2728 returnelem

14、entData(index);29 从中可以看出get和Iterator的next函数同样通过直接定位数据获取元素,只是多了几个判断而已。c.从上可以看出即便在千万大小的ArrayList中,几种遍历方式相差也不过50ms左右,且在常用的十万左右时间几乎相等,考虑foreach的优点,我们大可选用foreach这种简便方式进展遍历。(3)LinkedList遍历方式结果分析1pareloopperformanceofLinkedList23listsize|100|1,000|10,000|100,0005 for each10ms|1ms|1ms|2ms67foriterator|0ms|0ms|0ms|2ms89forlist.size()|0ms|1ms|73ms

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号