黑马程序员技术交流社区

标题: 在hashset集合中什么时候需要去实现iterable接口 [打印本页]

作者: 江江会回来的    时间: 2015-9-19 22:22
标题: 在hashset集合中什么时候需要去实现iterable接口
iterator和iterable有什么区别,自己也查找了一些资料,但是还是有困惑
用iterator内部类方法实现有什么好处?

作者: 大大大卷    时间: 2015-9-19 22:50
本帖最后由 大大大卷 于 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的原理
与楼主共勉!
以上!

作者: sandyluo    时间: 2015-9-19 22:51
简单的说,就是是遍历hashSet()中的元素的使用iterator迭代器
作者: 江江会回来的    时间: 2015-9-19 22:57
谢谢!这块掌握的不牢
作者: 江江会回来的    时间: 2015-9-19 22:59
大大大卷 发表于 2015-9-19 22:50
我是菜鸟,我是这么理解的啊:

iterator

谢谢!好详细
作者: 江江会回来的    时间: 2015-9-20 00:57
大大大卷 发表于 2015-9-19 22:50
我是菜鸟,我是这么理解的啊:查了下api发现我说反了,改一下!

java.lang.iterable

感谢层主,分享这么多经验,谢谢!
共勉




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2