java – 为什么这个代码不会导致ConcurrentModificationException?

我正在阅读关于ConcurrentModificationException和如何避免它.发现 an article.该文章中的第一个列表的代码类似于以下内容,这显然会引起例外:
List<String> myList = new ArrayList<String>();
myList.add("January");
myList.add("February");
myList.add("march");

Iterator<String> it = myList.iterator();
while(it.hasNext())
{
    String item = it.next();
    if("February".equals(item))
    {
        myList.remove(item);
    }
}

for (String item : myList)
{
    System.out.println(item);
}

然后继续解释如何用各种建议来解决问题.

当我试图重现它,我没有得到例外!为什么我没有得到例外?

解决方法

根据Java API docs Iterator.hasNext不会引发ConcurrentModificationException.

检查“1月”和“2月”后,从列表中删除一个元素.调用it.hasNext()不会引发ConcurrentModificationException但返回false.因此,您的代码完全退出.最后一个字符串从不被检查.如果您将“April”添加到列表中,则按预期得到“异常”.

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class Main {
        public static void main(String args[]) {

                List<String> myList = new ArrayList<String>();
                myList.add("January");
                myList.add("February");
                myList.add("march");
                myList.add("April");

                Iterator<String> it = myList.iterator();
                while(it.hasNext())
                {
                    String item = it.next();
                    System.out.println("Checking: " + item);
                    if("February".equals(item))
                    {
                        myList.remove(item);
                    }
                }

                for (String item : myList)
                {
                    System.out.println(item);
                }

        }
}

http://ideone.com/VKhHWN

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...