A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

iterator和iterable有什么区别,自己也查找了一些资料,但是还是有困惑
用iterator内部类方法实现有什么好处?

5 个回复

倒序浏览
本帖最后由 大大大卷 于 2015-9-19 23:29 编辑

我是菜鸟,我是这么理解的啊:查了下api发现我说反了,改一下!

java.lang.iterable
这个类是自所有collection子类的超接口,实现这个接口允许使用foreach语句
他的iterable()方法的源代码如下:

  1. public interface Iterable<T> {

  2.     /**
  3.      * Returns an iterator over a set of elements of type T.
  4.      *
  5.      * @return an Iterator.
  6.      */
  7.     Iterator<T> iterator();
  8. }
复制代码

这是一个抽象方法,我们可以看看子类是怎么覆盖的,这是ArrayList的iterable方法
  1.     public Iterator<E> iterator() {
  2.         return new Itr();
  3.     }

  4.     /**
  5.      * An optimized version of AbstractList.Itr
  6.      */
  7.     private class Itr implements Iterator<E> {
  8.         int cursor;       // index of next element to return
  9.         int lastRet = -1; // index of last element returned; -1 if no such
  10.         int expectedModCount = modCount;

  11.         public boolean hasNext() {
  12.             return cursor != size;
  13.         }

  14.         @SuppressWarnings("unchecked")
  15.         public E next() {
  16.             checkForComodification();
  17.             int i = cursor;
  18.             if (i >= size)
  19.                 throw new NoSuchElementException();
  20.             Object[] elementData = ArrayList.this.elementData;
  21.             if (i >= elementData.length)
  22.                 throw new ConcurrentModificationException();
  23.             cursor = i + 1;
  24.             return (E) elementData[lastRet = i];
  25.         }

  26.         public void remove() {
  27.             if (lastRet < 0)
  28.                 throw new IllegalStateException();
  29.             checkForComodification();

  30.             try {
  31.                 ArrayList.this.remove(lastRet);
  32.                 cursor = lastRet;
  33.                 lastRet = -1;
  34.                 expectedModCount = modCount;
  35.             } catch (IndexOutOfBoundsException ex) {
  36.                 throw new ConcurrentModificationException();
  37.             }
  38.         }

  39.         final void checkForComodification() {
  40.             if (modCount != expectedModCount)
  41.                 throw new ConcurrentModificationException();
  42.         }
  43.     }
复制代码


java.util.iterator
实现这个接口的类可以实现next(),hasNext(),remove(),方法
因为迭代器在每次调用next()方法时,返回的是当前的游标的位置的元素

而如果实现iterable借口,调用foreach语句,每次调用这个方法,都是从集合的第一个元素开始遍历

我感觉自己还是有点蒙,不过还是懂了iterable,interator的原理
与楼主共勉!
以上!
回复 使用道具 举报 1 0
简单的说,就是是遍历hashSet()中的元素的使用iterator迭代器
回复 使用道具 举报
谢谢!这块掌握的不牢
回复 使用道具 举报
大大大卷 发表于 2015-9-19 22:50
我是菜鸟,我是这么理解的啊:

iterator

谢谢!好详细
回复 使用道具 举报
大大大卷 发表于 2015-9-19 22:50
我是菜鸟,我是这么理解的啊:查了下api发现我说反了,改一下!

java.lang.iterable

感谢层主,分享这么多经验,谢谢!
共勉
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马