Arraylist、Linkedlist遍历方式性能分析

本文主要介绍ArrayList和LinkedList这两种list的经常使用循环遍历方式,各类方式的性能分析。熟悉java的知道,经常使用的list的遍历方式有如下几种:java

一、for-each数组

List<String> testList = new ArrayList<String>();
for (String tmp : testList) 
{	
  //use tmp;
}

这种遍历方式是最经常使用的遍历方式,由于书写比较方便,并且不须要考虑数组越界的问题,Effective-Java中推荐使用此种写法遍历。性能

二、迭代器方式指针

List<String> testList = new ArrayList<String>();
for (Iterator<String> iterator = testList.iterator(); iterator.hasNext();)
{
    //String tmp = iterator.next();
}

三、下标递增或递减循环blog

List<String> testList = new ArrayList<String>();
for (int i = 0; i < testList.size(); i++;)
{
    //String tmp = testList.get(i);
}

下标递增或者递减循环是最先接触到的遍历方式,会常常出现数组越界的问题。get

以上三种遍历方式是在使用list时最经常使用的方式,那么这三种方式在遍历的速度已经性能上又有什么区别呢?咱们从数据的底层实现上来进行分析。it

List底层储存都是使用数组来进行存储的,ArrayList是直接经过数组来进行存储,而LinkedList则是使用数组模拟指针,来实现链表的方式,所以从这里就能够总结出,ArrayList在使用下标的方式循环遍历的时候性能最好,经过下标能够直接取数据,速度最快。而LinkedList由于有一层指针,没法直接取到对应的下标,所以在使用下标遍历时就须要计算对应的下面是哪一个元素,从指针的头一步一步的走,因此效率就很低。想到指针就会联想到迭代器,迭代器能够指向下一个元素,而迭代器就是使用指针来实现的,所以LinkedList在使用迭代器遍历时会效率最高,迭代器直接经过LinkedList的指针进行遍历,ArrayList在使用迭代器时,由于要经过ArrayList先生成指针,所以效率就会低于下标方式,而for-each又是在迭代器基础上又进行了封装,所以效率会更低一点,可是会很接近迭代器。性能分析

总结:在进行list遍历时,若是是对ArrayList进行遍历,推荐使用下标方式,若是是LinkedList则推荐使用迭代器方式。class

相关文章
相关标签/搜索