当我对List进行排序时,它的迭代器会发生什么?
假设我有一个List
对象和该列表的迭代器 。
现在我用java.util.Collections.sort()
对列表进行排序
- 迭代器会发生什么?
- 它的行为是否仍然定义,是否仍然可以使用?
- 如果没有,我可以阻止销毁列表的迭代器吗?
我知道,这个问题可以通过改变程序设计来克服,例如克隆列表,但我特别想知道Java的“官方”行为。
java.util
中的大多数集合都是“fail-fast”,如果更改了底层集合,则可能抛出ConcurrentModificationException
。 应该指出的是,这是用于调试,因此不能保证。 根据javadocs, AbstractList
的所有死者都是如此,但CopyOnWriteArrayList
不适用于multithreading用途。
除了通过迭代器本身之外,迭代器在对其底层集合进行任何修改后通常都是无效的。 (例如, ListIterator
允许插入和删除。)
我当然希望任何迭代器在排序之后变得无效 – 如果它们不是,我不知道会有什么样的期望。
通常,集合上的任何类型的变异都会使其迭代器无效。 通过迭代器完成的变异不会使该迭代器失效。 有一些特殊的集合实现,例如CopyOnWriteArrayList
。
一般的解决方案是对集合的副本进行排序或重新创建迭代器。
我编写了一些代码来查看在迭代时对集合进行排序时会发生什么。 似乎迭代器不会抛出任何exception,但会继续正常迭代。 如果您希望迭代未分类的集合,它仍会给您错误的结果。 看那个 :
public static void main(String[] args) { List list = new ArrayList (); list.add("D"); list.add("B"); list.add("A"); list.add("C"); list.add("E"); Iterator it = list.iterator(); String s = it.next(); System.out.println(s); s = it.next(); System.out.println(s); Collections.sort(list); Iterator it2 = list.iterator(); s = it.next(); System.out.println(s); s = it.next(); System.out.println(s); s = it.next(); System.out.println(s); while (it2.hasNext()) { System.out.println(it2.next()); } }
希望能帮助到你。