是否可以执行以下操作?
List<String> list = new ArrayList<String>();
Iterator<String> iterator = list.listIterator();
populateList(list);
在用数据填充列表之前,我正在创建一个列表并获取它的迭代器。我可以使用迭代器获取列表的元素吗?获取迭代器和填充数组的顺序有什么不同吗?
任何帮助将不胜感激。
是否可以执行以下操作?
List<String> list = new ArrayList<String>();
Iterator<String> iterator = list.listIterator();
populateList(list);
在用数据填充列表之前,我正在创建一个列表并获取它的迭代器。我可以使用迭代器获取列表的元素吗?获取迭代器和填充数组的顺序有什么不同吗?
任何帮助将不胜感激。
是的,这很重要。当您使用或在您的迭代器上时,您将获得ConcurrentModificationException 。的迭代器是快速失败的,这意味着一旦 arraylist 的基础结构通过添加或删除元素发生更改,它将立即抛出 CME。hasNext()
next()
ArrayList
编辑:
迭代器checkForComodification()
首先在 hasNext() 和 next() 中调用
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
Java 在其数据结构上使用时间戳。在执行next()
orhasNext()
方法之前,它会检查时间戳是否等于创建迭代器时的时间戳。
原因是例如在 a 的情况下HashSet<T>
,可以定义一个迭代器,但是在添加元素之后,不能保证顺序相同。因此,一个活动的迭代器可以不止一次地产生一些项目,而其他项目则根本不会被迭代。
关于 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