iterable与iterator
1、迭代器的感性认识
对于Collection类下的集合如各种List各种Set,用于实现这些集合的数据结构各不相同,比如数组实现的ArrayList、链表实现的LinkedList,当客户端知道要使用的集合的底层结构的时候可以选择相应的遍历方式。
比如客户端知道ArrayList是用数组实现的,可以使用遍历数组的方式遍历ArrayList。如果客户端需要遍历的容器类型发生了变换可能就不能或者不适合使用先前的遍历方式,比如如果把ArrayList换成LinkedList,虽然仍然可以使用这种方式遍历但性能大大降低;如果换成某个set,甚至不能使用这种方式遍历。
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3); for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
为了提高代码的通用性减小耦合性,在客户端和容器之间新增了一个新的角色:迭代器,迭代器负责屏蔽了各种Collection实现类的区别,采用同样的迭代器语法可以遍历Collection的所有子类,这样以来客户端的代码无需关心集合类的具体实现。
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
} Iterator<Integer> linkIterator = list2.iterator();
while (linkIterator.hasNext()){
System.out.println(linkIterator.next());
} Iterator<Integer> setIterator = set.iterator();
while (setIterator.hasNext()){
System.out.println(setIterator.next());
}
迭代器往小了说是一种遍历集合的方式,往大了说他也是一种设计模式。
2、源码
可以猜出迭代器应该是某种接口,而且是应该靠近Collection继承体系顶层的接口,因为Collection集合下的所有类是通用的。
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
iterable接口中第一个方法用来返回iterator对象,二者的名字很像。从英语语法的角度分析iterable是一个形容词代表实现了该接口的对象有可迭代的能力,iterator是一个名词是具体迭代的执行者又称迭代器。实现了iterable接口的集合对象通过返回的iterator实现了对该集合的迭代。剩下两个方法的jdk-1.8中新增的,它们使用default关键字修饰。default关键字允许在接口中定义方法,且不要求实现了该接口的类实现该方法。
package java.util; import java.util.function.Consumer; /**
public interface Iterator<E> { boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
关注的重点是iterator方法,hasNext方法用于判断集合中是否存在下一个元素,next用于取出下一个元素;剩下的两个default修饰的方法是jdk-1.8新增的。
iterable与iterator的更多相关文章
- Java中的Iterable与Iterator详解
在Java中,我们可以对List集合进行如下几种方式的遍历: List<Integer> list = new ArrayList<>(); list.add(5); list ...
- java学习--Iterable 和 Iterator
Iterable Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的. 一个集合对象要表明自己支持迭代,能有使用foreach语句的特权,就必须实现Iterable接口,表明我 ...
- java 中的 Comparable 和 Comparator 与 Iterable 和 Iterator
Comparable 和 Comparator Comparable 和 Comparator 是两个关系不大的类,其分别侧重于不同的方面. 其中,接口 Comparable<T> 强行对 ...
- 聊一聊Iterable与Iterator的那些事!
前言 欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识! 在上一篇文章通过面试题,让我们来了解Collection,我们会发现Collection接口之上还 ...
- Python学习之路day4-列表生成式、生成器、Iterable和Iterator
一.列表生成式 顾名思义,列表生成式就是用于生成列表的特殊语法形式的表达式. 1.1 语法格式 [exp for iter_var in iterable] 工作过程: 1.通过iter_var迭代i ...
- Python:Iterable和Iterator
转于:https://blog.csdn.net/whgqgq/article/details/63685066 博主:gongqi1992 iterable和iterator最基本的区别: iter ...
- Java中的Enumeration、Iterable和Iterator接口详解
前言 在看各类Java书籍或者博文的时候,总是会遇到Enumeration.Iterable和Iterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把 ...
- Java基础之Iterable与Iterator
Java基础之Iterable与Iterator 一.前言: Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的.able结尾的表示 能...样,可以做.... Iterato ...
- Java集合【4】-- iterable和Iterator的异同分析详解
目录 一.iterator介绍 二.iterable接口 三.为什么有Iterator还需要Iterable 一.iterator介绍 iterator接口,也是集合大家庭中的一员.和其他的Map和C ...
随机推荐
- [算法总结] 13 道题搞定 BAT 面试——字符串
1. KMP 算法 谈到字符串问题,不得不提的就是 KMP 算法,它是用来解决字符串查找的问题,可以在一个字符串(S)中查找一个子串(W)出现的位置.KMP 算法把字符匹配的时间复杂度缩小到 O(m+ ...
- tomcat中 server.xml
tomcat服务器, 配置文件server.xml中的各项配置的意义 <?xml version="1.0" encoding="UTF-8"?> ...
- 使用typeof()或者typeof数据类型检测
使用typeof()或者typeof进行基本数据类型检测( typeof(X)等于typeof X 返回的是数据类型) 数据类型有:基本数据类型,字符串(string),布尔值(true/fals ...
- 洛谷P2234 [HNOI2002]营业额统计
题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...
- 2018-11-16 中文代码示例之Programming in Scala笔记第四五六章
续前文: 中文代码示例之Programming in Scala学习笔记第二三章. 同样仅节选有意思的例程部分作演示之用. 源文档仍在: program-in-chinese/Programming_ ...
- ionic APP二维码插件 地址
二维码插件地址第一个 https://github.com/kyocn/BarcodeScanner git网址 下载网址 https://github.com/kyocn/BarcodeSc ...
- mysql之事务管理
本文内容: 什么是事务管理 事务管理操作 回滚点 默认的事务管理 首发日期:2018-04-18 什么是事务管理: 可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不 ...
- Team Services的打包管理
Team Services的打包管理 概述 Package Management (打包管理)是一种扩展,可以更容易地发现.安装和发布包. 它与Team Services中心如构建功能深度集成,这样打 ...
- ZooKeeper使用命令大全
stat path [watch] set path data [version] ls path [watch] delquota [-n|-b] path ls2 path ...
- [20181108]12c sqlplus rowfetch参数4.txt
[20181108]12c sqlplus rowfetch参数4.txt --//12cR2 可以改变缺省rowfetch参数.11g之前缺省是1.通过一些测试说明问题.--//前几天做的测试有点乱 ...