Java集合(二)--Iterator和Iterable
2024-09-30 06:45:53
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则不然,每次调用都会返回一个从头开始计数的迭代器。 多个迭代器是互不干扰的。
最新文章
- SpringMVC+MyBatis整合——事务管理
- 从AdventureWorks学习数据库建模——保留历史数据
- HDU5840 (分块+树链剖分)
- Scala包
- [转] Makefile经典教程(掌握这些足够)
- 【crunch bang】文件管理器-thunar
- Html游戏开发-画图
- [设计模式] .NET设计模式笔记 - 了解设计模式
- 导出项目为jar包
- oracle sysdba用户远程登录
- 数据结构(二维线段树,差分): NOI2012 魔幻棋盘
- android笔记1——开发环境的搭建
- Linux应用环境实战05:在Ubuntu 14.10中借用Windows的字体 (转)
- wc--Linux
- Ubuntu 16.04 安装垃圾清理工具 BleachBit
- android Q build 变化
- Python自定义-分页器
- js运用5
- ansible系列7-mysql_user模块
- jdk8-stream的api
热门文章
- Ubuntu redmine 安装
- DOS命令汇总
- Spark 大数据文本统计
- org.springframework.web.struts.ContextLoaderPlugIn 和 org.springframework.web.context.ContextLoaderListener
- UVa 1471 Defense Lines (二分+set优化)
- PCB Web版SI9000阻抗计算器
- 工作日记:C#获取操作系统、MAC地址、登录用户、网卡、物理内存信息
- bzoj 3503: [Cqoi2014]和谐矩阵【高斯消元】
- input type=";file";文件上传到后台读取
- Android项目通过Android Debug Database实时查看本地Sqlite数据库内容