ArrayList.sort可以在抛出异常之前修改列表吗?

时间:2016-04-12 06:43:54

标签: java sorting arraylist

我正在尝试使用Collections.sort()方法对ArrayList进行排序。 但是,我的比较器并不完全尊重合同,在某些情况下,sort方法会抛出异常:java.lang.IllegalArgumentException:比较方法违反了它的一般合同!

我的问题是当发生这种情况时列表的状态。它可以被修改(部分排序)吗?它有可能丢失元素吗?

1 个答案:

答案 0 :(得分:1)

查看Collections.sort的代码(在Java 8中调用List.sort),对数组执行排序(使用Arrays.sort),然后将元素分配给按排序顺序列出。

因此,在排序过程中抛出的任何异常都会阻止List被修改。

default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ListIterator<E> i = this.listIterator();
    for (Object e : a) {
        i.next();
        i.set((E) e);
    }
}

BTW,这是List界面中出现的默认实现。如果任何List实现使用在排序完成之前修改List的实现覆盖此实现,则问题的答案可能会发生变化。