我正在尝试使用Collections.sort()方法对ArrayList进行排序。 但是,我的比较器并不完全尊重合同,在某些情况下,sort方法会抛出异常:java.lang.IllegalArgumentException:比较方法违反了它的一般合同!
我的问题是当发生这种情况时列表的状态。它可以被修改(部分排序)吗?它有可能丢失元素吗?
答案 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
的实现覆盖此实现,则问题的答案可能会发生变化。