• Java中的Enumeration、Iterable和Iterator接口详解


    前言

    在看各类Java书籍或者博文的时候,总是会遇到EnumerationIterableIterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把这三个接口总结一下,一扫之前的各种迷惑。

    Enumeration

    Enumeration(枚举)接口的作用和Iterator类似,但只提供了遍历VectorHashTable类型集合元素的功能,不支持元素的移除操作。

    Enumeration接口声明的方法如下:

    方法 描述
    boolean hasMoreElements() 还有更多要提取的元素时返回true,在枚举所有元素后返回false
    E nextElement() 返回集合中的下一个元素

    由于Enumeration接口已由Iterator取代,所有我这里就不做更详细的总结。这里提供一个简单的使用Demo:

    import java.util.Enumeration;
    import java.util.Hashtable;
    import java.util.Vector;
    
    public class EnumerationDemo {
        public static void main(String[] args) {
            Vector v = new Vector();
            v.addElement("Lisa");
            v.addElement("Billy");
            v.addElement("Mr Brown");
    
            Enumeration e = v.elements();
    
            while (e.hasMoreElements()) {
                String value = (String)e.nextElement();
                System.out.println(value);
            }
    
            Hashtable h = new Hashtable();
            h.put("name", "Yanggd");
            h.put("age", "25");
            h.put("location", "内蒙古呼和浩特");
    
            e = h.keys();
    
            while (e.hasMoreElements()) {
                String key = (String) e.nextElement();
                String value = (String) h.get(key);
                System.out.println("KEY =>" + key + "; VALUE=>" + value);
            }
        }
    }
    

    Iterable和Iterator

    迭代器是一种模式、可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。

    • Iterable:实现这个接口的集合对象支持迭代,是可以迭代的;实现了这个可以配合foreach使用;
    • Iterator:迭代器,提供迭代机制的对象,具体如何迭代是这个Iterator接口规范的。

    Iterable接口有以下三个方法:

    方法 描述
    Iterator iterator() 返回一个Iterator对象
    void forEach(Consumer<? super T> action) 对集合中的每个元素执行action动作
    Spliterator spliterator() 返回一个Spliterator对象

    Iterator接口有以下三个方法:

    方法 描述
    boolean hasNext() 每次next之前,先调用此方法探测是否迭代到终点
    E next() 返回当前迭代元素,同时,迭代游标后移
    void remove() 删除最近一次已近迭代出出去的那个元素;只有当next执行完后,才能调用remove函数

    Java容器中,所有的Collection子类会实现Iteratable接口以实现foreach功能,Iteratable接口的实现又依赖于实现了Iterator的内部类(参照LinkedList中listIterator()和descendingIterator()的JDK源码)。有的容器类会有多个实现Iterator接口的内部类,通过返回不同的迭代器实现不同的迭代方式。

    下面通过一个简单的例子来说明IterableIterator,看懂了下面的代码,也就看明白了IterableIterator

    import java.util.*;
    
    public class IterableDemo implements Iterable<String> {
        private String[] words = "I love coding".split("");
    
        // 默认迭代器
        public Iterator<String> iterator() {
            // 匿名内部类
            return new Iterator<String>() {
                private int index = 0;
    
                @Override
                public boolean hasNext() {
                    return index < words.length;
                }
    
                @Override
                public String next() {
                    return words[index++];
                }
    
                @Override
                public void remove() {
                    throw new UnsupportedOperationException();
                }
            };
        }
    
        // 反向迭代器
        public Iterable<String> reverseIterator() {
            return new Iterable<String>() {
                @Override
                public Iterator<String> iterator() {
                    return new Iterator<String>() {
                        private int index = words.length - 1;
    
                        @Override
                        public boolean hasNext() {
                            return index > -1;
                        }
    
                        @Override
                        public String next() {
                            return words[index--];
                        }
    
                        @Override
                        public void remove() {
                            throw new UnsupportedOperationException();
                        }
                    };
                }
            };
        }
    
        public static void main(String[] args) {
            IterableDemo iterableDemo = new IterableDemo();
    
            // 默认迭代器
            for (String value : iterableDemo) {
                System.out.print(value);
            }
    
            System.out.println();
    
            // 反向迭代器
            for (String value : iterableDemo.reverseIterator()) {
                System.out.print(value);
            }
        }
    }
    

    总结

    又是一个小的知识点,再恶补一下。重温一下这些细节,让自己以后少掉点坑。

    2019年7月21日 于内蒙古呼和浩特。

  • 相关阅读:
    适配器模式
    控制器的显示注入
    自定义过滤器
    配置路由
    JavaScript判断浏览器类型及版本(新增IE11)
    路径别名
    判断是否是IE浏览器和是否是IE11
    页面视图中的按钮操作指向
    安卓开发环境搭建与环境变量设置
    html中iframe子页面与父页面元素的访问以及js变量的访问
  • 原文地址:https://www.cnblogs.com/vipygd/p/11223468.html
Copyright © 2020-2023  润新知