Java开发工程师是怎样炼成的------ArrayList(1)

来源:互联网 发布:热水器 类型 知乎 编辑:程序博客网 时间:2024/03/29 15:47

    看看下面的代码:

 

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的元素时,无法从此类监看动作中得到好处。

原创粉丝点击