原文
java中的迭代器使我們能夠遍歷Collection對象。 集合返回的迭代器本質上是Fail Fast的或 Fail Safe的。 如果在迭代集合時修改集合,則Fail-Fast迭代器立即拋出ConcurrentModificationException。 當 Fail Safe迭代器不會拋出任何異常,如果一個集合被修改,而迭代它。 因為,它們對集合的克隆操作,而不是對實際集合。 讓我們詳細看看Fail Fast 和 Fail Safe迭代器。
由大多數集合類型返回的Fail-Fast迭代器不能容忍對集合進行迭代時的任何結構修改。 (結構修改意味著添加,刪除或更新集合中的元素)如果在迭代正在集合上進行結構上修改,則拋出ConcurrentModificationException。 但是,如果集合被迭代器自己的方法(如remove())修改,它們不會拋出任何異常。
所有集合類型維護一個內部對象數組(Object [])來存儲元素。 Fail-Fast迭代器直接從此數組獲取元素。 他們總是認為這個內部數組在迭代其元素時不會被修改。 要知道集合是否被修改,它們使用一個名為modCount的內部標志,每次修改集合時更新它。 每次當一個Iterator調用next()方法時,它會檢查modCount。 如果發現modCount在創建了這個Iterator之后已經被更新,它會拋出ConcurrentModificationException。
import java.util.ArrayList;import java.util.Iterator;public class FailFastIteratorExample { public static void main(String[] args) { //Creating an ArrayList of integers ArrayList<Integer> list = new ArrayList<Integer>(); //Adding elements to list list.add(1452); list.add(6854); list.add(8741); list.add(6542); list.add(3845); //Getting an Iterator from list Iterator<Integer> it = list.iterator(); while (it.hasNext()) { Integer integer = (Integer) it.next(); list.add(8457); //This will throw ConcurrentModificationException } } }Fail-Safe迭代器不會拋出任何異常,如果集合被修改,而迭代它。 因為,他們迭代的集合的克隆而不是實際的集合。 因此,對實際收集執行的任何結構修改都不會被這些迭代器注意到。 但是,這些迭代器有一些缺點。 其中之一是,并不總是保證你將在迭代時獲得最新的數據。 因為迭代器創建后對集合的任何修改都不會在迭代器中更新。 這些迭代器的另一個缺點是,在時間和內存方面創建集合的副本將有額外的開銷。
import java.util.Iterator;import java.util.concurrent.ConcurrentHashMap;public class FailSafeIteratorExample { public static void main(String[] args) { //Creating a ConcurrentHashMap ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>(); //Adding elements to map map.put("ONE", 1); map.put("TWO", 2); map.put("THREE", 3); map.put("FOUR", 4); //Getting an Iterator from map Iterator<String> it = map.keySet().iterator(); while (it.hasNext()) { String key = (String) it.next(); System.out.新聞熱點
疑難解答