本文主要介绍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