Iterable:

public interface Iterable<T> {
Iterator<T> iterator();
}

上面是Iterable源码,只有一个iterator(),所以Iterable接口只是用来返回一个新的迭代器,意味着这个集合支持迭代

Collection是list和set的父接口,而Collection实现了Iterable,所以list和set都可以使用迭代器

Iterator:

public interface Iterator<E> {
boolean hasNext(); E next(); }

例如ArrayList的使用,只不过这里是向上转型,返回list,而不是ArrayList

public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3);
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}

而如果使用ArrayList<Integer> list = new ArrayList<>();去使用迭代器,返回的是ArrayList内部维护的Itr()

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();
}
}
}

ListIterator:

  ListIterator只能用于list的迭代,可以双向移动

public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
ListIterator iterator = list.listIterator();
while (iterator.hasPrevious()) {
System.out.println(iterator.previous());
}
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}

为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢?

以下解答来自百度,很多文章都是这样写的,具体出处我也找不到了

  因为Iterator接口的核心方法next()或者hasNext()是依赖于迭代器的当前迭代位置的。 如果Collection直接实现Iterator接口,势必导致集合

对象中包含当前迭代位置的数据(指针)。 当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。 除

非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。 但即时这样,Collection也只能同时存在一个当前迭代位置。

  而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。 多个迭代器是互不干扰的。

最新文章

  1. SpringMVC+MyBatis整合——事务管理
  2. 从AdventureWorks学习数据库建模——保留历史数据
  3. HDU5840 (分块+树链剖分)
  4. Scala包
  5. [转] Makefile经典教程(掌握这些足够)
  6. 【crunch bang】文件管理器-thunar
  7. Html游戏开发-画图
  8. [设计模式] .NET设计模式笔记 - 了解设计模式
  9. 导出项目为jar包
  10. oracle sysdba用户远程登录
  11. 数据结构(二维线段树,差分): NOI2012 魔幻棋盘
  12. android笔记1——开发环境的搭建
  13. Linux应用环境实战05:在Ubuntu 14.10中借用Windows的字体 (转)
  14. wc--Linux
  15. Ubuntu 16.04 安装垃圾清理工具 BleachBit
  16. android Q build 变化
  17. Python自定义-分页器
  18. js运用5
  19. ansible系列7-mysql_user模块
  20. jdk8-stream的api

热门文章

  1. Ubuntu redmine 安装
  2. DOS命令汇总
  3. Spark 大数据文本统计
  4. org.springframework.web.struts.ContextLoaderPlugIn 和 org.springframework.web.context.ContextLoaderListener
  5. UVa 1471 Defense Lines (二分+set优化)
  6. PCB Web版SI9000阻抗计算器
  7. 工作日记:C#获取操作系统、MAC地址、登录用户、网卡、物理内存信息
  8. bzoj 3503: [Cqoi2014]和谐矩阵【高斯消元】
  9. input type=&quot;file&quot;文件上传到后台读取
  10. Android项目通过Android Debug Database实时查看本地Sqlite数据库内容