一 问题的提出

  关于JavaCollections.sortArrays.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的稳定性问题的更多相关文章

  1. Java中Collections类的排序sort函数两种用法

    java中的Colletions类主要实现列表List的排序功能.根据函数参数的传递,具体的排序可以分为 : 1.  自然排序(natural ordering). 函数原型:sort(List< ...

  2. Java中Collections.sort()排序详解

      public static void main(String[] args) { List<String> list = new ArrayList<String>(); ...

  3. Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用

    摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...

  4. java中Collections.sort排序详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...

  5. (网页)java中Collections.sort排序详解(转)

    转自CSDN: Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b, ...

  6. [转]java中Collections.sort排序详解

      Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e, ...

  7. Java的数组和list升序,降序,逆序函数Collections.sort和Arrays.sort的使用

    list升序,降序,逆序List<Integer>list =new ArrayList<Integer>();//如果list是 5 7 2 6 8 1 41.升序:Coll ...

  8. Java中Collections的sort方法和Comparable与Comparator的比较

    一.Comparable 新建Student1类,类实现Comparable接口,并重写compareTo方法 public class Student1 implements Comparable& ...

  9. Java 容器 & 泛型:四、Colletions.sort 和 Arrays.sort 的算法

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 本来准备讲 Map集合 ,还是喜欢学到哪里总结吧.最近面试期准备准备,我是一员,成功被阿里在线笔试秒杀 ...

随机推荐

  1. woj1008feedinganimals2-贪心-网络流

    title: woj1008feedinganimals2-贪心-网络流 date: 2020-03-07 categories: acm tags: [acm,woj,网络流,贪心] 中等题. 标准 ...

  2. 快速搞懂.NET 5/.NET Core应用程序的发布部署

    .NET Framework时代,.NET 应用程序大多直接部署运行在Windows服务器上,当然也可以通过Mono部署运行在Linux上.无论部署exe,还是IIS站点.或是Windows Serv ...

  3. 【GitChat首秀:限时免费】互联网测试岗校招的那些事儿

    2020 校园秋招即将结束,2021 校招春招即将开始. 作为一名扎根互联网近十年的资深测试开发,我刚经历过数十个测试岗位的校招笔试和面试选拔.在 2020 年秋招面试过程中,我深深地感受到" ...

  4. LeetCode Binary Search All In One

    LeetCode Binary Search All In One Binary Search 二分查找算法 https://leetcode-cn.com/problems/binary-searc ...

  5. Swift All in One

    Swift All in One Swift 5.3 https://github.com/apple/swift-evolution Xcode https://developer.apple.co ...

  6. free online linux terminal & github cli online

    free online linux terminal & github cli online gitpod https://www.gitpod.io/features/ https://bc ...

  7. Mysql通过binlog恢复误update的数据

    事件: 在生产库执行update时只添加了STATUS(状态)条件,将所有状态为'E'的数据全部改为了'D' 思路: 操作步骤主要参考自文章:https://blog.csdn.net/weixin_ ...

  8. pyhton的函数

    目录 一.函数引入 二.函数的定义 三.如何定义一个函数 四.定义函数的三种形式 1.空函数 2.有参函数 3.无参函数 五.函数的调用 六.函数的返回值 七.函数的参数 1.形参 1.1 位置形参 ...

  9. docker mysql初始化多个sql脚本

    一.概述 现有一台服务器,需要部署mysql.其中mysql容器,需要在第一次启动时,执行多个sql文件. 文件名 说明 执行顺序 init.sql 创建数据库以及用户 1 users.sql 用户表 ...

  10. Prometheus时序数据库-磁盘中的存储结构

    Prometheus时序数据库-磁盘中的存储结构 前言 之前的文章里,笔者详细描述了监控数据在Prometheus内存中的结构.而其在磁盘中的存储结构,也是非常有意思的,关于这部分内容,将在本篇文章进 ...