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比较
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比较
以下源码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;
}但输出的过程大相径庭,完全跟我的想法不一样,虽然最后排序结果是降序是对的,但跟我预期的排序过程(冒泡排序)完全不一样
很奇怪,有没大神解释一波