当我对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()); } } 

希望能帮助到你。