迭代器 Iterator 是什么?
Java容器的頂部接口就是Iterator。是一個可以遍歷集合的對象,為各種容器提供了公共的操作接口,隔離對容器的遍歷操作和底層實現,從而解耦。
- java迭代器查找的唯一操作就是依靠調用next,而在執行查找任務的同時,迭代器的位置也在改變.
- Iterator迭代器remove方法會刪除上次調用next方法返回的元素.這也意味之remove方法和next有着很強的依賴性.如果在 調用remove之前沒有調用next是不合法的 .這個接口衍生出了,java集合的迭代器.java集合的迭代器使用
{ boolean hasNext() //如果仍有元素可以迭代,則返回 true。 E next() //返回迭代的下一個元素。 void remove() //刪除 default void forEach //實現了迭代器接口的類才可以使用forEach }
查看最新圖片,請點擊:https://www.processon.com/apps/58bd73cfe4b0f944a6660f38
迭代器 Iterator 怎么使用?
易錯點:Iterator調用remove之前沒有調用next是不合法的
class test { public static void run() { List<Integer> list = new LinkedList<>(); list.add(1); list.add(2); list.add(3); list.add(3); //依靠這個方法生成一個java集合迭代器<--在Colletion接口中的方法,被所有集合實現. Iterator<Integer> iterator = list.iterator(); // iterator.remove();報錯java.lang.IllegalStateException iterator.next(); iterator.remove();//不報錯,刪掉了1 System.out.println(list);//AbstractCollection類中實現的toString讓list可以直接被打印出來 while (iterator.hasNext()) {//迭代器,hasNext()集合是否為空 Integer a = iterator.next();//可以用next訪問每一個元素 System.out.println(a);//2,3,3 } for (int a : list) {//也可以使用foreach System.out.println(a);//2,3,3 } } public static void main(String[] args) { run(); } }
當然你也會有點好奇,為什么 remove 方法前面必須跟着一個next方法.其實這個只能這么解釋.
迭代器的next方法的運行方式並不是類似於數組的運行方式.
當然,這張圖主要是讓你理解一下.
數組的指針指向要操作的元素上面,而迭代器卻是將要操作的元素放在運動軌跡中間.
本質來講,迭代器的指針並不是指在元素上,而是指在元素和元素中間.
假設現在調用remove().被刪除的就是2號元素.(被迭代器那個圓弧籠蓋在其中的那個元素).如果再次調用,就會報錯,因為圓弧之中的2號元素已經消失,那里是空的,無法刪除.
參考
不眠不休不寫bug:java集合詳解