迭代器
我对迭代器有了深刻的印象是在玩大数据的时候
为什么这个世界上要有迭代器这个东西。
迭代器是个指针 不存储 数据, 具体领悟到是在scala 的 数据集那块的知识点。
一个迭代器是有游标的,迭代器存在线程共享的问题。
可以每个线程都 在自己栈 里生成迭代器,这样就能分开自己玩自己的了。
foreach 是语法糖
Java和Scala中的foreach 其实都是迭代器的语法糖
java代码通过反编译 看出真身。
package com.huo.learn.scala;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.CountDownLatch;
/**
* foreach遍历 和 我们自己new的 itr 用的不是同一个吧?
*/
public class JavaItrTest {
public static void main(String[] args) {
// CountDownLatch countDownLatch = new CountDownLatch(1);
ArrayList<String> strings = new ArrayList<>();
strings.add("1");
strings.add("2");
strings.add("3");
strings.add("4");
strings.add("5");
strings.add("6");
System.out.println();
// 自己写的iterator
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
/*
* 上面都是main线程 顺序执行的,走到这的时候 上面的迭代器肯定已经遍历完了
* 起了一个新的线程,迭代器对于这两个线程来说 是共享的,所以下面线程也拿不到了
* */
new Thread(() -> {
System.out.println(iterator.hasNext());
// 直接foreach 看看反编译后的结果
/*
* 反编译后的结果 产生了一个var2
Iterator var2 = strings.iterator();
while(var2.hasNext()) {
String string = (String)var2.next();
System.out.println(string);
}
因为上面反编译出来是var2 那我们自己建一个var2 发现反编译后 会产生一个var3。
由此可见增强for 不会和我们自己的迭代器冲突
Iterator<String> var2 = strings.iterator();
* */
for (String string : strings) {
System.out.println(string);
}
}).start();
}
}