迭代器与foreach

2018-07-23  本文已影响0人  sjandroid

对于“foreach”增强型for循环和集合框架中的“Iterator”想必都不会陌生,今天记录一下关于“迭代器”与“foreach”之间的一些关系。
目录:


使用

使用foreach遍历容器数据的话,只需要写几行代码就ok了

    private static void test_2(){
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");

        for(String str : list){
            System.out.println(str);
        }
    }

不知道大家有没有想过,为什么foreach除了可以遍历数组外还可以遍历容器类中的数据元素呢?
接下来就介绍下原因与原理。


原因&原理

之所以foreach可以遍历jdk中定义的容器类中的数据是因为这些系统类都实现了Iterable接口。我们来看下集合框架中顶层接口Collection的实现。

image.png

原理知道之后,我们来看看如何应用“Iterable,Iterator”通过foreach循环来遍历自定义容器类中的数据吧。


应用

private static void test_1(){
        Test<String> test = new Test<>(new String[]{"Hello", "World", "!"});

        for(String str : test){
            System.out.println(str);
        }
    }

    /**
     * 具体的Iterable实现类
     */
    private static class Test<T> implements Iterable<T>{
        private T[] array;

        public Test(T[] array) {
            this.array = array;
        }

        @Override
        public Iterator<T> iterator() {
            return new TestIterator<>(array);
        }

        /**
         * 自定义迭代器
         */
        private static class TestIterator<E> implements Iterator<E>{

            private E[] array;
            private int index;

            public TestIterator(E[] array) {
                this.array = array;
            }

            @Override
            public boolean hasNext() {
                return this.index < this.array.length;
            }

            @Override
            public E next() {
                return this.array[this.index++];
            }
        }
    }

log

Hello
World
!

参考:

《Java编程思想》

上一篇 下一篇

猜你喜欢

热点阅读