1
我想使用Collections.sort()方法對ArrayList進行排序。 但是,我的比較器並沒有完全尊重契約,在某些情況下,排序方法會拋出一個異常:java.lang.IllegalArgumentException:比較方法違反了它的一般契約!ArrayList.sort可以在引發異常之前修改列表嗎?
我的問題是關於發生這種情況時列表的狀態。它可以被修改(部分排序)嗎?它有可能失去了元素嗎?
我想使用Collections.sort()方法對ArrayList進行排序。 但是,我的比較器並沒有完全尊重契約,在某些情況下,排序方法會拋出一個異常:java.lang.IllegalArgumentException:比較方法違反了它的一般契約!ArrayList.sort可以在引發異常之前修改列表嗎?
我的問題是關於發生這種情況時列表的狀態。它可以被修改(部分排序)嗎?它有可能失去了元素嗎?
查看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);
}
}
順便說一句,這是在List
接口出現的默認實現。如果有任何List
實現用排序完成前修改List
的實現覆蓋此實現,則可以更改您的問題的答案。
打我一秒。 :)它實際上也在JavaDoc中:「該實現將指定的列表轉儲到數組中,對數組進行排序,並對列表中的每個元素進行迭代,以重置數組中相應位置的每個元素。」 – yshavit
這是真的,但ArrayList重寫此方法,並沒有相同的行爲,這就是爲什麼我的問題是專門關於ArrayList –
@yshavit在哪個Javadoc你看到了嗎? Collections.sort的Java 8 Javadoc不包含這種語言。我只在List.sort的'@ implSpec'標籤下看到類似的語言。 – Eran