zoukankan      html  css  js  c++  java
  • 关于Java中Collections.sort和Arrays.sort的稳定性问题

    一 问题的提出

      关于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)使用的是归并排序,是稳定的.

  • 相关阅读:
    zhuan:Jmeter基础之---jmeter基础概念
    zhuan:JMeter基础之--元件的作用域与执行顺序
    zhuan:JMeter基础之—录制脚本
    zhuan:一种简单的数据库性能测试方法
    转:使用JMeter创建FTP测试计划
    转:JMeter基础之一 一个简单的性能测试
    性能学习
    [转]JMeter学习(一)工具简单介绍
    后端文件接收resd()和chunk的区别
    PyQt环境安装
  • 原文地址:https://www.cnblogs.com/dybala21/p/12827546.html
Copyright © 2011-2022 走看看