public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(1);
        list.add(2);
        list.add(5);
        list.add(4);        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                System.out.println("-----------");
                return o2 - o1;
            }
        });
        System.out.println(list);
    }
}
(----------------------------------------------)
1
3
-----------
2
1
-----------
2
1
-----------
2
3
-----------
5
2
-----------
5
3
-----------
4
2
-----------
4
3
-----------
4
5
-----------
[5, 4, 3, 2, 1]
为什么2和1会比较两次,还有5和4不跟1比较

解决方案 »

  1.   

    crtl进源码。。
      

  2.   

    说实话看源码我看的很懵逼
    以下源码public static <T> void sort(T[] a, Comparator<? super T> c) {
            if (c == null) {
                sort(a);
            } else {
                if (LegacyMergeSort.userRequested)     //我看到这是永远是true,感觉是进这条分支
                    legacyMergeSort(a, c);
                else
                    TimSort.sort(a, 0, a.length, c, null, 0, 0);
            }
        }private static void mergeSort(Object[] src,
                                      Object[] dest,
                                      int low,
                                      int high,
                                      int off) {
            int length = high - low;        // Insertion sort on smallest arrays
            if (length < INSERTIONSORT_THRESHOLD) {           //列表长度为5   5 < 7  故进这里
                for (int i=low; i<high; i++)
                    for (int j=i; j>low &&
                             ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
                        swap(dest, j, j-1);
                return;
            }但输出的过程大相径庭,完全跟我的想法不一样,虽然最后排序结果是降序是对的,但跟我预期的排序过程(冒泡排序)完全不一样
    很奇怪,有没大神解释一波