zoukankan      html  css  js  c++  java
  • 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的面试题?

  • 相关阅读:
    预编译
    AndroidRuntime: android.app.RemoteServiceException: Bad notification posted from package
    RadioButton和RadioGroup一点使用心得
    POJ 2774 Long Long Message 后缀数组
    POJ 2406 Power String 后缀数组
    URAL 1297 Palindrome 后缀数组+RMQ
    SPOJ 694 705 后缀数组
    POJ 3261 Milk Patterns 后缀数组
    POJ 1743 Musical Theme 后缀数组
    HDU 5040 Instrusive BFS
  • 原文地址:https://www.cnblogs.com/ConstXiong/p/11903918.html
Copyright © 2011-2022 走看看