zoukankan      html  css  js  c++  java
  • java中foreach遍历的原理

         在平时Java程序中,应用比较多的就是对Collection集合类的foreach遍历,foreach之所以能工作,是因为这些集合类都实现了Iterablei接口,该接口中定义了Iterator迭代器的

    产生方法,并且foreach就是通过Iterable接口在序列中进行移动。

     Iterablei接口API:

    package java.lang;
    
    import java.util.Iterator;
    
    public interface Iterable
    {
    
        public abstract Iterator iterator();
    }

     该接口中定义了产生Iterator迭代器的方法;

    package java.util;
    
    
    public interface Iterator
    {
    
        public abstract boolean hasNext();
    
        public abstract Object next();
    
        public abstract void remove();
    }

     因此如果自己建的一个类也实现了Iterable接口,并且实现了具体产生Iterator的方法,foreach方法也是同样适用于新建类的,结合适配器模式的一个样例如下:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Random;
    
    public class IteartorClass implements Iterable<String> {
        protected static final String[] WORDS = "just for test iterable interface".split(" ");
    
        @Override
        public Iterator<String> iterator() {
            return new Iterator<String>() {
                private int index = 0;
    
                public boolean hasNext() {
                    return index < WORDS.length - 1;
                }
    
                @Override
                public String next() {
                    return WORDS[index++];
                }
    
                @Override
                public void remove() {
                }
            };
        }
    
        public static void main(String[] args) {
            mutileIteratorClass class1 = new mutileIteratorClass();
            for (String string : class1.randomNized()) {
                System.out.print(string + " ");
            }
            System.out.print("
    ");
            for (String string : class1.reversed()) {
                System.out.print(string + " ");
            }
    
        }
    
    }
    
    class mutileIteratorClass extends IteartorClass {
    
        public Iterable<String> reversed() {
            return new Iterable<String>() {
                public Iterator<String> iterator() {
    
                    return new Iterator<String>() {
    
                        private int index = WORDS.length - 1;
    
                        public boolean hasNext() {
                            return index >= 0;
                        }
    
                        public String next() {
                            return WORDS[index--];
                        }
    
                        public void remove() {
    
                        }
    
                    };
                }
            };
        }
    
        public Iterable<String> randomNized() {
            return new Iterable<String>() {
                public Iterator<String> iterator() {
                    List<String> list = new ArrayList<String>(Arrays.asList(WORDS));
                    Collections.shuffle(list, new Random(20));
                    return list.iterator();
                }
    
            };
    
        }
    }
  • 相关阅读:
    编译原理实验2简化版的C语言文法 159
    大数据概述 159
    第三次实验有限自动机的构造与识别 159
    Vue非单文件组件
    vue生命周期
    css3boxsizing
    openCV学习笔记(2)__openCV简单的图片处理(雪花,减少颜色)
    openCV学习笔记(1)__openCV与vs2010环境设置
    CentOS防火墙配置
    CentOS 6初始化配置
  • 原文地址:https://www.cnblogs.com/toDjlPersonnalBlog/p/3494988.html
Copyright © 2011-2022 走看看