关于Java中Collections.sort和Arrays.sort的稳定性问题
一 问题的提出
关于Java中Collections.sort和Arrays.sort的使用,需要注意的是,在本文中,比较的只有Collections.sort(List<T> elements)和Arrays.sort(int[] var0).
对这个问题产生兴趣是因为这两者使用的时候稳定性是有差异的,那么稳定性究竟为什么有差异呢?刚开始令我好奇的是Collections.sort的源码中竟然也使用到了Arrays.sort.
二 代码分析
Arrays.sort的源代码如下
public static void sort(int[] var0) {
DualPivotQuicksort.sort(var0, 0, var0.length - 1, (int[])null, 0, 0);
这里的DualPivotQuicksort其实就是对传统的快排算法进行改进的快排,区别就是将数组切成了三段.
Collections.sort的源代码如下
default void sort(Comparator<? super E> var1) {
Object[] var2 = this.toArray();
Arrays.sort(var2, var1);
ListIterator var3 = this.listIterator();
Object[] var4 = var2;
int var5 = var2.length;
for(int var6 = 0; var6 < var5; ++var6) {
Object var7 = var4[var6];
var3.next();
var3.set(var7);
}
}
这里会明显看见调用了Arrays.sort,但是只要到Arrays中去仔细看,会发现其实是不同的.
public static <T> void sort(T[] var0, Comparator<? super T> var1) {
if (var1 == null) {
sort(var0);
} else if (Arrays.LegacyMergeSort.userRequested) {
legacyMergeSort(var0, var1);
} else {
TimSort.sort(var0, 0, var0.length, var1, (Object[])null, 0, 0);
}
}
到了这里,其实大致也就清楚了,对于TimSort.sort其实就是一个相对于legacyMergeSort性能更加好的归并排序.
三 总结
对于Arrays.sort(int[] var0)使用的是快排,所以是不稳定的.
对于Collections.sort(List<T> elements)使用的是归并排序,是稳定的.
关于Java中Collections.sort和Arrays.sort的稳定性问题的更多相关文章
- Java中Collections类的排序sort函数两种用法
java中的Colletions类主要实现列表List的排序功能.根据函数参数的传递,具体的排序可以分为 : 1. 自然排序(natural ordering). 函数原型:sort(List< ...
- Java中Collections.sort()排序详解
public static void main(String[] args) { List<String> list = new ArrayList<String>(); ...
- Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用
摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...
- java中Collections.sort排序详解
Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...
- (网页)java中Collections.sort排序详解(转)
转自CSDN: Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b, ...
- [转]java中Collections.sort排序详解
Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e, ...
- Java的数组和list升序,降序,逆序函数Collections.sort和Arrays.sort的使用
list升序,降序,逆序List<Integer>list =new ArrayList<Integer>();//如果list是 5 7 2 6 8 1 41.升序:Coll ...
- Java中Collections的sort方法和Comparable与Comparator的比较
一.Comparable 新建Student1类,类实现Comparable接口,并重写compareTo方法 public class Student1 implements Comparable& ...
- Java 容器 & 泛型:四、Colletions.sort 和 Arrays.sort 的算法
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 本来准备讲 Map集合 ,还是喜欢学到哪里总结吧.最近面试期准备准备,我是一员,成功被阿里在线笔试秒杀 ...
随机推荐
- flagcounter 被禁用...
源地址 https://s11.flagcounter.com/count2/arWz/bg_FFFFFF/txt_000000/border_CCCCCC/columns_2/maxflags_14 ...
- npm/yarn查看当前使用源与设置其它源
npm, yarn查看源和换源: npm config get registry // 查看npm当前镜像源 npm config set registry https://registry.npmj ...
- Spring应用上下文生命周期
Spring应用上下文生命周期整体分成四个阶段 ConfigurableApplicationContext#refresh,加载或者刷新持久化配置 ConfigurableApplicationCo ...
- 微软收购 GitHub
微软收购 GitHub 微软收购 GitHub震惊业界:引发开发者信任问题 https://news.cnblogs.com/n/598432/ GitLab refs xgqfrms 2012-20 ...
- Object 循环引用 All In One
Object 循环引用 All In One circular reference bug var a = {}; a.a = a; refs deep copy bug https://segmen ...
- vue & vue router & dynamic router
vue & vue router & dynamic router https://router.vuejs.org/guide/essentials/dynamic-matching ...
- yapi & mock JSON
yapi & mock JSON json, body https://hellosean1025.github.io/yapi/documents/mock.html response bo ...
- Objec.assign & bug
Objec.assign & bug shallow copy https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Referenc ...
- c++ 使用PID获取可执行文件路径
注意看备注 https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmodulefilenameexa #includ ...
- mui上拉刷新
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...