JDK源码中的Iterator

Iterator的意思是迭代器。

JDK源码中,Iterator是一个接口。

 

源码中,实现了Iterator接口的类,有很多:见图

 

1) java.util.*包中,所熟悉的一些Collection子类:AbstractList HashMap Hashtable LinkedHashMap LindedList TreeMap等;

2) java.util.concurrent*包中,诸如 ArrayBlockingQueue ConcurrentHashMap ConcurrentLinkedQueue

3) javax.imageio.*包,javax.print.*包,javax.xml.*包中都存在这样的类(who implemented Iterator接口)

 


 

迭代器相关的接口有两个:Iterator Iterable

 

从名字中,就能猜出它两啥用途:

Iterator意思为迭代器,Iterator及其子类通常是迭代器/迭代子本身的结构与方法;

Iterable意为可迭代的,那些想用到迭代器功能的其它类,如AbstractList HashMap等,需要实现该接口。

 

细看下两个接口文件:

 

Iterator.java  (只有三个方法)

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}

 

Iterable.java   (只有一个方法)

public interface Iterable<T> {
    Iterator<T> iterator();
}
 

通常的用法是:

某个类A( AbstractList )想使用迭代器,则它的类声明需是:class A implement Iterable

那么类A实现中,要实现Iterable接口中的唯一方法:Iterator<T> iterator();

这个方法用于返回一个迭代器/迭代子,即Iterator接口及其子类;

 

 

然后在类A中,定义一个内部类S,专门用于实现Iterator接口,定制类A自已的迭代器实现。

即:

class A implement Iterable
{
    Iterator<T> iterator() {...}
    class S implement Iterator<E> 
    {
        boolean hasNext() {....}
        E next() {....}
        void remove() {....}
    }
}
 

另外一个类B (如HashMap)也想使用迭代器,则依葫芦画瓢,方法、类声明啥的都一样,只是方法体不同。

所以,若A类的一个对象a想使用迭代器功能,则需要:

1) 获取迭代器对象: Iterator<E> iter = a.iterator();

2) 然后可以使用迭代器的三个方法进行迭代操作:   iter.hasNext()     iter.next()     iter.remove()

 

 

举例,看看AbstractList类:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {

    protected AbstractList() {
    }
  
    ...

    public Iterator<E> iterator() {
	return new Itr();
    }

    private class Itr implements Iterator<E> {
     
    int cursor = 0;
    int lastRet = -1;
    int expectedModCount = modCount;

	public boolean hasNext() {
            return cursor != size();
	}

	public E next() {
            checkForComodification();
	    try {
		E next = get(cursor);
		lastRet = cursor++;
		return next;
	    } catch (IndexOutOfBoundsException e) {
		checkForComodification();
		throw new NoSuchElementException();
	    }
	}

	public void remove() {
	    if (lastRet == -1)
		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();
	}
    }
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值