迭代器Iterator

来源:互联网 发布:java gbk utf8 转换 编辑:程序博客网 时间:2024/06/07 06:48
package cn.test.collection;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;/**  -----|Collection 单例集合的根接口*  --------|List 实现List接口的话 有序 可重复*  --------|Set  实现Set接口的话    无序 不可重复*  *  Collection--- 迭代的方法*    toArray() *    iterator() *    *  迭代器的作用:*       用于抓取集合中的元素*  *  迭代器的方法:*   boolean hasNext()  问是否有元素可遍历,如果仍有元素可以迭代,则返回 true。     E next()           返回迭代的下一个元素。 全部返回就报错    void remove()      从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。    java.util.NoSuchElementException  没有元素的异常       异常的原因:没有元素可以迭代了*/public class Demo2 {    public static void main(String[] args) {        Collection c = new ArrayList();        c.add("狗娃");        c.add("狗剩");        c.add("铁蛋");        c.add("美美");        /*//遍历集合的元素 --- 方式一:可以使用toArray方法。        Object[] arr = c.toArray();//toArray把集合的元素存储到toArray中返回        for (int i = 0; i < arr.length; i++) {            System.out.println(arr[i]+",");        }*/        //要求使用迭代器遍历数组 iterator()         //疑问:iterator()方法返回时一个接口类型,为什么接口又可以调用方法可以使用呢?        //iterator()方法实际返回的是接口的实现类对象        Iterator  it  =  c.iterator();//返回一个迭代器  疑问:iterator()方法返回时一个接口类型,为什么接口又可以调用方法可以使用呢?        System.out.println("有元素可以遍历吗?"+it.hasNext());        while(it.hasNext()){//hasnext() 问是否有元素可以遍历            System.out.println("获取元素:"+it.next());        }        //System.out.println("获取元素:"+it.next()); 加上这句会报错 --java.util.NoSuchElementException  没有元素的异常    }}

迭代器工作原理

/*Iterator()各方法的源码*/ private class Itr implements Iterator<E> {        int cursor;       // index of next element to return        int lastRet = -1; // index of last element returned; -1 if no such        int expectedModCount = modCount;        public boolean hasNext() {            return cursor != size;        }        @SuppressWarnings("unchecked")        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];        }        public void remove() {            if (lastRet < 0)                throw new IllegalStateException();            checkForComodification();            try {                ArrayList.this.remove(lastRet);                cursor = lastRet;                lastRet = -1;                expectedModCount = modCount;            } catch (IndexOutOfBoundsException ex) {                throw new ConcurrentModificationException();            }        }
0 0
原创粉丝点击