Java開發工程師是怎樣煉成的------ArrayList(1)

    看看下面的代碼:

 

import java.util.*;
public class FailFast {
  
public static void main(String[] args) {
    List c 
= new ArrayList();
    c.add(
"1");
    c.add(
"2");
    
for(int i=0;i<c.size();i++){
        System.out.println(
"c.size():"+c.size());
        
if(i==0){c.add("An object");}
        System.out.println(c.get(i));
    }

  }

}
 

    當你運行這段代碼的時候,你就會領略到這段代碼的有趣之處了。程序是這樣測試的:

1.建立一個ArrayList

2..添加兩個字符串。

3.用一個循環將ArrayList中的東西打印出來,問題就在循環體內。在第一次循環的時候,我往容器中添加了一個字符串。結果在第二次循環的是時候,它就判斷出,容器裏字符串的個數變化了。

  再看下面的一個程序

import java.util.*;
public class FailFast {
  
public static void main(String[] args) {
    List c 
= new ArrayList();
    c.add(
"1");
    c.add(
"2");
    Iterator it 
= c.iterator();
    c.add(
"An Object");   
    String s 
= (String)it.next();
  }

}
 

這段程序代碼使用了迭代器。結果回返回異常:

 

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:
449)
    at java.util.AbstractList$Itr.next(AbstractList.java:
420)
    at FailFast.main(FailFast.java:
13)

原因:

    JAVA容器有一個機制(FAIL FAST),可以防止多個進程修改同一個容器的內容。如果你正在走訪某個容器,另一個進程卻要進行元素的安插、刪除、修改等動作,便會發生問題。JAVA容器會查找“因你的進程而做的任何改變”之外的所有容器變化。如果它偵測到其他進程也在修改同一個容器,就會立刻產生一個java.util.ConcurrentModificationException。然而當你運用GET()來訪問List的元素時,無法從此類監看動作中得到好處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章