• Iterator怎么使用?有什么特点?


    Iterator 接口源码中的方法

    • java.lang.Iterable 接口被 java.util.Collection 接口继承,java.util.Collection 接口的 iterator() 方法返回一个 Iterator 对象
    • next() 方法获得集合中的下一个元素
    • hasNext() 检查集合中是否还有元素
    • remove() 方法将迭代器新返回的元素删除
    • forEachRemaining(Consumer<? super E> action) 方法,遍历所有元素

    JDK 1.8 源码如下:

    //是否有下一个元素
    boolean hasNext();
     
    //下一个元素
    E next();
     
    //从迭代器指向的集合中删除迭代器返回的最后一个元素
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
     
    //遍历所有元素
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }

    Iterator 的使用示例

    public class TestIterator {
        
        static List<String> list = new ArrayList<String>();
        
        static {
            list.add("111");
            list.add("222");
            list.add("333");
        }
        
     
        public static void main(String[] args) {
            testIteratorNext();
            System.out.println();
            
            testForEachRemaining();
            System.out.println();
            
            testIteratorRemove();
        }
        
        //使用 hasNext 和 next遍历 
        public static void testIteratorNext() {
            Iterator<String> iterator = list.iterator();
            while (iterator.hasNext()) {
                String str = iterator.next();
                System.out.println(str);
            }
        }
        
        //使用 Iterator 删除元素 
        public static void testIteratorRemove() {
            Iterator<String> iterator = list.iterator();
            while (iterator.hasNext()) {
                String str = iterator.next();
                if ("222".equals(str)) {
                    iterator.remove();
                }
            }
            System.out.println(list);
        }
        
        //使用 forEachRemaining 遍历
        public static void testForEachRemaining() {
            final Iterator<String> iterator = list.iterator();
            iterator.forEachRemaining(new Consumer<String>() {
     
                public void accept(String t) {
                    System.out.println(t);
                }
                
            });
        }
    }

    注意事项

    • 在迭代过程中调用集合的 remove(Object o) 可能会报 java.util.ConcurrentModificationException 异常
    • forEachRemaining 方法中 调用Iterator 的 remove 方法会报 java.lang.IllegalStateException 异常
    //使用迭代器遍历元素过程中,调用集合的 remove(Object obj) 方法可能会报 java.util.ConcurrentModificationException 异常
        public static void testListRevome() {
             ArrayList<String> aList = new ArrayList<String>();
             aList.add("111");
             aList.add("333");
             aList.add("222");
             System.out.println("移除前:"+aList);
             
             Iterator<String> iterator = aList.iterator();
             while(iterator.hasNext())
             {
                 if("222".equals(iterator.next()))
                 {
                    aList.remove("222");          
                 }
             }
             System.out.println("移除后:"+aList);
        }
        
        //JDK 1.8 Iterator forEachRemaining 方法中 调用Iterator 的 remove 方法会报 java.lang.IllegalStateException 异常
        public static void testForEachRemainingIteRemove () {
            final Iterator<String> iterator = list.iterator();
            iterator.forEachRemaining(new Consumer<String>() {
     
                public void accept(String t) {
                    if ("222".equals(t)) {
                        iterator.remove();
                    }
                }
            });
        }

      

    来一道刷了进BAT的面试题?

  • 相关阅读:
    想用Nginx代理一切?行!
    [SuProxy]Ngnix+Lua 实现SSH2,LDAP,ORACLE,SQLSERVER等TCP/IP协议分析,劫持,代理,会话及负载
    hive分区表详细介绍
    hive 中自定义UDF函数和自定义UDTF函数
    yarn工作原理
    HDFS小文件问题
    HDFS读写流程
    利用 canvas 实现签名效果
    idea里面自带的翻译插件
    idea的set,get插件
  • 原文地址:https://www.cnblogs.com/ConstXiong/p/11903918.html
Copyright © 2020-2023  润新知