Java集合(二)--Iterator和Iterable
时间:2019-06-17
本文章向大家介绍Java集合(二)--Iterator和Iterable,主要包括Java集合(二)--Iterator和Iterable使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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则不然,每次调用都会返回一个从头开始计数的迭代器。 多个迭代器是互不干扰的。
原文地址:https://www.cnblogs.com/huigelaile/p/11042520.html
- 分享一次Linux任务计划crontab不执行的问题排查过程
- MySQL 5.6, 5.7并行复制测试(r12笔记第9天)
- MySQL 5.6, 5.7并行复制测试(二)(r12笔记第10天)
- MySQL主从报错解决:Failed to initialize the master info structure
- 使用pt工具检测MySQL主从延迟(r12笔记第7天)
- WordPress发布/更新文章、提交/审核评论自动清理VeryCloud缓存
- MySQL中的binlog和redo浅析(r12笔记第5天)
- WordPress发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存
- 使用sysbench压力测试MySQL(一)(r11笔记第3天)
- 分享一下php7和其他php多版本共存的配置教程
- 使用sysbench压力测试MySQL(二)
- 使用sysbench压力测试MySQL(三)(r12笔记第6天)
- 解决IE响应式的解决方案css3-mediaqueries.js不生效问题
- MySQL传输表空间小结(r12笔记第2天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Leetcode 第23场双周赛A 5360. 统计最大组的数目 (手速题,map)
- Java 水题系列(4)数组合并
- SpringBoot 整合 SpringDataJPA
- Codeforces Beta Round #51 C. Pie or die(博弈 思维)
- SpringDateJPA 系列之 JPA 中的相关操作
- python Turtle 画出“精美碎花小清新树”快来拿代码!
- SpringDataJPA 系列之 JPA 简介
- Leetcode 264. 丑数 II (数论,三指针,类dp)
- Leetcode 628. 三个数的最大乘积 (数学)
- Vue 组件化开发
- Spring Boot 基础配置
- 读懂 Java 单例模式
- 数值分析第一次实习题报告
- Leetcode 409. 最长回文串 (Hash)
- Vue 前后端交互基础