java中排序源码分析(JDK1.8)
程序员文章站
2022-03-22 09:09:26
...
List排序
在开发过程中常用的是jdk自带的排序
Collections.sort(List<T> list, Comparator<? super T> c);
打开源码如下:
@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
也就说可以直接调用list.sort©进行排序,那么list的sort方法是如何实现排序的,继续看源码ArrayList 的sort实现
@Override
@SuppressWarnings("unchecked")
public void sort(Comparator<? super E> c) {
final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, size, c);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
ArrayList的底层是数组,通过 Arrays.sort()对数组进行排序
数组排序
Arrays.sort(T[] a, Comparator<? super T> c);
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
当Comparator == null时,调用sort(a, fromIndex, toIndex);如下
public static void sort(Object[] a, int fromIndex, int toIndex) {
rangeCheck(a.length, fromIndex, toIndex);
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, fromIndex, toIndex);
else
ComparableTimSort.sort(a, fromIndex, toIndex, null, 0, 0);
}
在jdk1.8中LegacyMergeSort.userRequested是false,可以通过System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
强制使用legacyMergeSort排序,目的是为了兼容低版本
TimSort是结合了合并排序(合并排序)和插入排序(插入排序)而得出的排序算法,它在现实中有很好的效率
由此可知:ArrayList和数组是用过 ComparableTimSort.sort()和 TimSort.sort()实现排序的。
参考博客:
MergeSort与TimSort,ComparableTimSort
Timsort详解
ComparableTimSort详解
下一篇: dos命令行不能输入中文怎么办该如何解决
推荐阅读
-
java中Object源码理解
-
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
-
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
-
Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析
-
Mybaits 源码解析 (六)----- 全网最详细:Select 语句的执行过程分析(上篇)(Mapper方法是如何调用到XML中的SQL的?)
-
Java中的容器(集合)之ArrayList源码解析
-
深入源码分析Spring中的构造器注入
-
Angular中$compile源码分析
-
Java中的容器(集合)之HashMap源码解析
-
HashMap源码分析--jdk1.8