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的面試題?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM