上篇博客介绍了因为重写比较方法引发的bug,这篇博客,咱们深入以下jdk对Collections.sort的实现,看看这个异常产生的原因,废话不多,先看源码:
1,Collections.sort
public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
}
可以看到只转化为数组,利用数据的排序实现,继续深入:
2,Arrays.sort
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, c);
}
LegacyMergeSort.userRequested的意思就是是否使用jdk6以前的经典算法啊,本篇文章先看经典算法: <