理解Java迭代器原理

引言

Java中一些简单的线性结构可以通过使用for循环和while循环来遍历,但是当我们要遍历一个很复杂的结构时,比如二叉树,这时就需要我们手写一个方法去遍历这个结构,但是如果没遇见一个复杂结构就去专门写一个方法,不说方法本身的难度问题,就从效率上讲,每个程序员水平都不一样,写出的代码效率肯定有高有低,所以Java为了解决这种情况,就设计了一个接口——Iterator,可以在不了解对象内部细节的情况下,遍历整个对象中的元素。

Iterator

package java.util;
public interface Iterator<E> {
    boolean hasNext();//判断是否存在下一个对象元素

    E next();//获取下一个元素

    void remove();//移除元素
}

Iterator中提供了三个方法,hasNext()方法用来判断是否还有下一个元素,next()方法用来获取下一个元素,remove()方法用来删除元素。这之中我们需要重点关注的是next方法和remove方法。下面我们来分析代码,首先出现最多的应该是checkForComodification()这个方法,这个方法是干什么用的呢,其实很简单,使用迭代器的类都存在一个modCount对象,增删操作都会使modCount++,可能很多人都知道使用迭代器是不能进行增加和删除操作的,因为在每次迭代时都会先获取modCount对象然后赋值给expectedModCount,如果在迭代过程中发现两个值不等了,就会立刻终止迭代,并抛出异常,这也被叫做"快速失败"机制, 例如在ArrayList等类创建迭代器之后,除非通过迭代器自身remove或add对列表结构进行修改,否则在其他线程中以任何形式对列表进行修改,迭代器马上会抛出异常,快速失败。

 public E next() {  
           checkForComodification();  
           try {  
               int i = cursor;  
               E next = get(i);  
               lastRet = i;  
               cursor = i + 1;  
               return next;  
           } catch (IndexOutOfBoundsException e) {  
               checkForComodification();  
               throw new NoSuchElementException();  
           }  
       }  
  
       public void remove() {  
           if (lastRet < 0)  
               throw new IllegalStateException();  
           checkForComodification();  
  
           try {  
               AbstractList.this.remove(lastRet);  
               if (lastRet < cursor)  
                   cursor--;  
               lastRet = -1;  
               expectedModCount = modCount;  
           } catch (IndexOutOfBoundsException e) {  
               throw new ConcurrentModificationException();  
           }  
       }  
  
       final void checkForComodification() {  
           if (modCount != expectedModCount)  
               throw new ConcurrentModificationException();  
           }  
       } 

Iterator

Package java.lang;

import java.util.Iterator;
public interface Iterable<T> {
    Iterator<T> iterator();
}

这个接口只有一个作用,就是给实现这个接口的类提供一个方法,可以生成一个迭代器,例如:

public static void main(String[] args) {
	  List<String> list = new ArrayList<String>();
	  list.add("这是一个迭代器");
      Iterator<String> listIt = list.iterator();
      while(listIt.hasNext()){
              System.out.println(listIt.next());
      }
}

熟悉的人都应该知道foreach循环的底层就是通过迭代器实现的。

迭代器的好处

  1. 迭代器可以提供统一的迭代方式。
  2. 迭代器也可以在对客户端透明的情况下,提供各种不同的迭代方式。
  3. 迭代器提供一种快速失败机制,防止多线程下迭代的不安全操作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值