進坑幾次了,有必要記錄下來
在使用迭代器遍歷集合時,如下代碼:
...
while(iterator.hasNext()){
System.out.println(iterator.next().getXxx()+"---"+iterator.next().getXxx());
}
我的意圖是用迭代器依次調用集合中的對象的get方法,上面的getXxx()分別是返回兩個對象屬性值;坑就在這里,報異常java.util.NoSuchElementException(沒有元素異常),但明明對象還沒有輸出遍歷完成;
- 原因:每調用一次next(),就會獲取下一位元素數據,改變指指針指向的是next(),並不是hasNext(),所以無論遍歷次數怎么變化,你調用了next()他就會接着讀取下一位;
- 總結:使用迭代器(Iterator)時,盡量一個遍歷結構只有一個hasNext()和next(),關鍵是理解next()是改變指針指向並且讀取元素數據的角色;
補充
- Iterator值傳遞機制:使用迭代器遍歷集合時,是將集合的值傳遞給迭代器變量,並非把傳遞集合元素本身(所以對迭代變量進行賦值操作並不會影響到集合)
- 使用迭代遍歷集合時,無法對集合元素進行修改,會報異常:java.util.ConcurrentModificationException