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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© huangkj 中级黑马   /  2014-11-24 23:21  /  1119 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Iterator不是接口么,里面的方法肯定也都是抽象方法,为啥还能用hasNest(); 和next(); 来遍历集合呢?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 杨佳名 于 2014-11-25 00:17 编辑

Iterator是集合的一种遍历方式。因为具体的集合不同,所采用的的数据排列方式就会不同,遍历的方式就会不一样。所以Iterator只定义成一个接口。拿ArrayList的Iterator举例,查看源码:
  1. public interface Iterator
  2.         {
  3.                 public abstract boolean hasNext();
  4.                 public abstract Object next();
  5.         }

  6.         public interface Collection
  7.         {
  8.                 public abstract Iterator iterator();
  9.         }
  10.        
  11.         public interface List extends Collection
  12.         {
  13.                 ...
  14.         }
  15.        
  16.         public class ArrayList implements List
  17.         {
  18.                 public Iterator iterator() {
  19.                         return new Itr();
  20.                 }

  21.                 private class Itr implements Iterator {
  22.                         public boolean hasNext() {
  23.                                 return xxx;
  24.                         }

  25.                         public E next() {
  26.                                 return xxx;
  27.                         }
  28.                 }
  29.         }
复制代码



其中...和xxx省略了代码中具体内容,不影响阅读就好。
可以看出,Iterator it = c.iterator();   是把Itr对象返回来了,而Itr已经实现了Iterator接口,这里是多态的表现。也表明了,虽然每种集合的数据结构不同,但都根据自己的特点,底层实现了Iterator,所以集合都可以用Iterator来进行遍历。




回复 使用道具 举报 1 0
看我这样理解对不对:这是一个多太的体现。Iterator是接口,但是每个元素里面都实现了Iterator。调用iterator()方法(hasNest(); 和next(); )来获取Iterator接口的子类对象,利用接口的子类对象来调用接口中的方法当然可以了。以上是我的个人理解,谢谢!
回复 使用道具 举报
其实Iterator接口在ArrayList集合中是以内部类的形式进行体现的。外部类提供一个访问内部类对象的公共的方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马