什么是迭代器?
迭代器,提供一种访问一个集合对象各个元素的途径,同时又不需要暴露该对象的内部细节。java通过提供Iterator和Iterable俩个接口来实现集合类的可迭代性,迭代器主要的用法是:首先用hasNext()作为循环条件,再用next()方法得到每一个元素,最后在进行相关的操作
示例代码:
public static void main(String[] args) {
List<String>list=new ArrayList<>();
list.add("a");
list.add("b");
Iterator<String>it=list.iterator();//得到lits的迭代器
//调用迭代器的hasNext方法,判断是否有下一个元素
while (it.hasNext()) {
//将迭代器的下标移动一位,并得到当前位置的元素值
System.out.println(it.next());
}
}
定义一个集合:
首先调用iterator方法,该方法调用一个iterator对象控制迭代的过程,我们称之为外部递归。接下来递归的具体操作就是调用hasNext以及next方法。
1.hasNext() 该方法英语判断集合对象是否还有下一个元素,如果已经是最后一个元素则返回false
2.next() 把迭代器的指向移到下一个位置,同时,该方法返回下一个元素的引用
从Java5.0开始,迭代器可以被foreach循环所替代,但是foreach循环的本质也是使用Iterator进行遍历的。
什么是Stream?
Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。
Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。
Stream和迭代器的区别:
Stream 可以并行化操作,迭代器只能命令式地、串行化操作。也就是当使用串行方式去遍历时,每个 item 读完后再读下一个 item。而使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。Stream 的并行操作依赖于 Java7 中引入的 Fork/Join 框架(JSR166y)来拆分任务和加速处理过程。
使用场景
当数据量不大或者没有太耗时的操作时,顺序执行(如iterator)往往比并行执行更快。当任务涉及到耗时操作(如I/O)并且任务之间不互相依赖时,那么并行化就是一个不错的选择。通常而言,将这类程序并行化之后,执行速度会提升好几个等级;