java Iterator(未完成)

来源:互联网 发布:淘宝直播镜像怎么下载 编辑:程序博客网 时间:2024/05/19 00:41

java Iterator

  • Iterator是集合的迭代器,在java 集合类中,是 Enumeration 的替代品,它和 Enumeration 有两个区别

    1. 允许调用者在iteratoe 删除所指向的Collection中的元素, Enumeration 则不行
    2. 方法名被改进了
  • Iterator 中只有3个方法,hasNext() , next() , remove()

  • java 中因为Collection实现了 Iterable, 所以list 和 set 都有了Iterator iterator()这个方法

  • Iterator 最重要的一点的是,能够对集合进行遍历时修改集合,一般的for循环是做不到的

ArrayList 中的实现(7u40-b43)

/**ArrayList 中定义了内部类Itr*class Itr implements Iterator<E>*重写了iterator方法,返回这个内部类 Itr*/    813     public Iterator<E> iterator() {814         return new Itr();815     }// 看一下Itr的实现代码 private class Itr implements Iterator<E> {//cursor 相当于遍历的标示,标示下一个位置821         int cursor;       // index of next element to return//lastRet就是当前的位置,通常来说,lastRet 比 cursor 小1 ,当调用remove后lastRet会被置为-1d822         int lastRet = -1; // index of last element returned; -1 if no such823         int expectedModCount = modCount;824 825         public boolean hasNext() {// cursor标示的是下一个位置,如果下一个位置是数组的长度,则表示后面没有数据了,好理解826             return cursor != size;827         }828 829         @SuppressWarnings("unchecked")830         public E next() {831             checkForComodification();832             int i = cursor;833             if (i >= size)834                 throw new NoSuchElementException();835             Object[] elementData = ArrayList.this.elementData;836             if (i >= elementData.length)837                 throw new ConcurrentModificationException();// 以访问第一个元素为例  cursor = 1  lastRet = 0 获取list数组的第0个元素838             cursor = i + 1;839             return (E) elementData[lastRet = i];840         }841 842         public void remove() {//在删除前,必须要进行next 操作843             if (lastRet < 0)844                 throw new IllegalStateException();845             checkForComodification();846 847             try {848                 ArrayList.this.remove(lastRet);849                 cursor = lastRet;850                 lastRet = -1;851                 expectedModCount = modCount;852             } catch (IndexOutOfBoundsException ex) {853                 throw new ConcurrentModificationException();854             }855         }856 857         final void checkForComodification() {858             if (modCount != expectedModCount)859                 throw new ConcurrentModificationException();860         }861     }// 从上面的代码分析,如果在remove前不调用next 方法,是会报错的// 从demo中运行,认证了上面的说法        ArrayList list = new ArrayList<String>();        list.add("111");        list.add("222");        list.add("333");        Iterator<String>  itr = list.iterator();        while(itr.hasNext()){             itr.remove();    // 这里会报错,因为没有调用next 方法  //java.lang.IllegalStateException        }
0 0
原创粉丝点击