ArrayList与LinkedList 遍历

循环遍历ArrayList 的四种方式:

  1. for-index
  2. for-each
  3. while
  4. Iterator 迭代器
    Demo如下:
public class LoopExample {
   public static void main(String[] args) {

      ArrayList<Integer> arrlist = new ArrayList<Integer>();
      arrlist.add(14);
      arrlist.add(7);
      arrlist.add(39);
      arrlist.add(40);

      /* For Loop for iterating ArrayList */
      System.out.println("For Loop");
      for (int counter = 0; counter < arrlist.size(); counter++) {            
          System.out.println(arrlist.get(counter));         
      }         

      /* Advanced For Loop*/        
      System.out.println("Advanced For Loop");      
      for (Integer num : arrlist) {               
           System.out.println(num);         
      }

      /* While Loop for iterating ArrayList*/       
      System.out.println("While Loop");         
      int count = 0;        
      while (arrlist.size() > count) {
     System.out.println(arrlist.get(count));
         count++;
      }

      /*Looping Array List using Iterator*/
      System.out.println("Iterator");
      Iterator iter = arrlist.iterator();
      while (iter.hasNext()) {
         System.out.println(iter.next());
      }
   }
}

循环遍历LinkedList的四种方式:

  1. for-index
  2. for-each
  3. while
  4. Iterator 迭代器

Demo代码如下:

public class LinkedListExample {

   public static void main(String args[]) {
      /*LinkedList declaration*/
      LinkedList<String> linkedlist=new LinkedList<String>();
      linkedlist.add("Apple");
      linkedlist.add("Orange");
      linkedlist.add("Mango");

      /*for loop*/
      System.out.println("**For loop**");
      for(int num=0; num<linkedlist.size(); num++)
      {
          System.out.println(linkedlist.get(num));
      }

      /*Advanced for loop*/
      System.out.println("**Advanced For loop**");
      for(String str: linkedlist)
      {
          System.out.println(str);
      }

      /*Using Iterator*/
      System.out.println("**Iterator**");
      Iterator i = linkedlist.iterator();
      while (i.hasNext()) {
      System.out.println(i.next());
      }

      /* Using While Loop*/
      System.out.println("**While Loop**");
      int num = 0;
      while (linkedlist.size() > num) {
      System.out.println(linkedlist.get(num));
      num++;
      }

   }
}

深入分析 Iterate 模式

for each这种写法其实是一个语法糖,其实
for(Box box:boxList) 等同于 for(Iterator var1 = boxList.iterator(); var1.hasNext();var1.next())
可以看到这种模式会去额外生成一个 Iterator 对象,所以相较于 Index 模式而言,它会额外使用一些内存(Android平台,分配过多临时对象,会导致内存不足进行GC,影响APP流畅度)。

Iterate 迭代过程中,会调用Iterator 的 next(),增加很多检查,会带来一定开销(检查遍历中是否有人修改)

public E next() {
    checkForComodification();  // 检查是否在遍历过程中有人修改了列表
     int i = cursor;
     if (i >= size)    // 检查下标是否合法
         throw new NoSuchElementException();
     Object[] elementData = ArrayList.this.elementData;
     if (i >= elementData.length) // 检查下标是否合法
         throw new ConcurrentModificationException();
     cursor = i + 1;
     return (E) elementData[lastRet = i];  // 返回对象
}

深入分析 Index模式

for(int index = 0; index < boxList.size();index++)
    ; // do something

这种方式其实并不够理想,因为每次循环时,都会去调用 List.size(),相对而言,保存 len 的方法更快,尤其在 Effective Java 中的范例:

for(int index = 0,n = expensiveComputation(); index < n;index++)
    ; // do something

如果一个方法耗时较多且结果不会改变,那么可以用一个临时变量充当缓存。

for-each和for-index 哪个快?(就是for(num:nums)和for(int i=0;i<n;i++))
for-each 是通过内部的迭代器进行遍历的,类似于索引;
for-index 是通过 index 计算偏移量的方式遍历。

1 若实现了RandomAccess接口,那么使用for-index是优于for-each的
2 对 ArrayList 这样的连续结构来说,for-each 和 for-index 的效率应该不相上下;而对 LinkedList 这样的链式列表,for-each 的索引优势就体现出来了。

什么时候没法用for-each代替for-index
需要往迭代器中插入元素或者删除元素时。(这会破坏迭代器结构,迭代器遍历模式会检查是否修改)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。