Java 迭代器与forEach

218 阅读1分钟

迭代器

我对迭代器有了深刻的印象是在玩大数据的时候

为什么这个世界上要有迭代器这个东西。
迭代器是个指针 不存储 数据, 具体领悟到是在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();


    }
}