0

是否可以执行以下操作?

List<String> list = new ArrayList<String>();
Iterator<String> iterator = list.listIterator();
populateList(list);

在用数据填充列表之前,我正在创建一个列表并获取它的迭代器。我可以使用迭代器获取列表的元素吗?获取迭代器和填充数组的顺序有什么不同吗?

任何帮助将不胜感激。

4

3 回答 3

6

是的,这很重要。当您使用或在您的迭代器上时,您将获得ConcurrentModificationException 。的迭代器是快速失败的,这意味着一旦 arraylist 的基础结构通过添加或删除元素发生更改,它将立即抛出 CME。hasNext()next()ArrayList

编辑: 迭代器checkForComodification()首先在 hasNext() 和 next() 中调用

final void checkForComodification() {
        if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
    }
于 2013-09-10T03:01:34.190 回答
1

Java 在其数据结构上使用时间戳。在执行next()orhasNext()方法之前,它会检查时间戳是否等于创建迭代器时的时间戳。

原因是例如在 a 的情况下HashSet<T>,可以定义一个迭代器,但是在添加元素之后,不能保证顺序相同。因此,一个活动的迭代器可以不止一次地产生一些项目,而其他项目则根本不会被迭代。

于 2013-09-10T03:05:58.407 回答
0

关于 Java 中的迭代器的要点:

1) Java 中的迭代器支持泛型,因此始终使用泛型版本的迭代器,而不是使用原始类型的迭代器。

2)如果你想从 Collection 中删除对象而不是使用 for-each 循环,而是使用 Iterator 的 remove() 方法来避免任何ConcurrentModificationException.

3) 使用迭代器对集合进行迭代取决于ConcurrentModificationException是否在迭代开始后修改了集合,但这仅发生在快速失败的迭代器的情况下。

4) Java 中有两种类型的迭代器,快速失败和安全失败。

例子: -

List<String> li = new ArrayList<String>();
        li.add("list1");
        li.add("list2");
        li.add("list3");
        System.out.println("Added");

        for(String st:li){
            if(st.equalsIgnoreCase("list1"))
                li.remove("list1");
        }

你会遇到ConcurrentModificationException这种情况。所以修改for循环使其工作。

Iterator<String> iter = li.iterator();
        while(iter.hasNext()){
            if(iter.next().equalsIgnoreCase("list1"))
                iter.remove();
        }

阅读更多:http: //javarevisited.blogspot.com/2011/10/java-iterator-tutorial-example-list.html#ixzz2eSRG7gAT

于 2013-09-10T03:43:54.757 回答