jdk8中的Arrays.sort

解析JDK8中Arrays.sort底层原理及其排序算法的选择 暂时网上看过很多JDK8中Arrays.sort的底层原理,有些说是插入排序,有些说是归并排序,也有说大于域值用计数排序法,否则就使用插入排序。。。其实不全对。让我们对着源码分析个究竟: // Use Quicksort on small arrays if (right - left < QUICKSORT_THRESHOLD) {//QUICKSORT_THRESHOLD = 286... 阅读详情

jdk8中Arrays.sort

这里可以看到根据传入数组类型的不同,排序的算法是由区别的。

拆分解析

我们在平时引用的时候,一般只会传入一个数组,但是真正调用的时候,参数会进行补全。 

    public static void sort(int[] a) {
        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
    }

    /**
     * Sorts the specified range of the array into ascending order. The range
     * to be sorted extends from the index {@code fromIndex}, inclusive, to
     * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
     * the range to be sorted is empty.
     *
     * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
     * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
     * offers O(n log(n)) performance on many data sets that cause other
     * quicksorts to degrade to quadratic performance, and is typically
     * faster than traditional (one-pivot) Quicksort implementations.
     *
     * @param a the array to be sorted
     * @param fromIndex the index of the first element, inclusive, to be sorted
     * @param toIndex the index of the last element, exclusive, to be sorted
     *
     * @throws IllegalArgumentException if {@code fromIndex > toIndex}
     * @throws ArrayIndexOutOfBoundsException
     *     if {@code fromIndex < 0} or {@code toIndex > a.length}
     */
    public static void sort(int[] a, int fromIndex, int toIndex) {
        rangeCheck(a.length, fromIndex, toIndex);
        DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
    }

Arrays.sort里面的排序是灵活的,选取条件一般是传入数组的类型,数组的长度,包括数组的有序度进行判断,然后来选择排序。

一般他会先对这个数组的合法进行一个检查。

这里我们以int的为例子

可以看到排序代码为:

static void sort(int[] a, int left, int right,
                     int[] work, int workBase, int workLen) {
        // Use Quicksort on small arrays
        if (right - left < QUICKSORT_THRESHOLD) {
            sort(a, left, right, true);
            return;
        }

        /*
         * Index run[i] is the start of i-th run
         * (ascending or descending sequence).
         */
        int[] run = new int[MAX_RUN_COUNT + 1];
        int count = 0; run[0] = left;

        // Check if the array is nearly sorted
        for (int k = left; k < right; run[count] = k) {
            if (a[k] < a[k + 1]) { // ascending
                while (++k <= right && a[k - 1] <= a[k]);
            } else if (a[k] > a[k + 1]) { // descending
                while (++k <= right && a[k - 1] >= a[k]);
                for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
                    int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
                }
            } else { // equal
                for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
                    if (--m == 0) {
                        sort(a, left, right, true);
                        return;
                    }
                }
            }

            /*
             * The array is not highly structured,
             * use Quicksort instead of merge sort.
             */
            if (++count == MAX_RUN_COUNT) {
                sort(a, left, right, true);
                return;
            }
        }

        // Check special cases
        // Implementation note: variable "right" is increased by 1.
        if (run[count] == right++) { // The last run contains one element
            run[++count] = right;
        } else if (count == 1) { // The array is already sorted
            return;
        }

        // Determine alternation base for merge
        byte odd = 0;
        for (int n = 1; (n <<= 1) < count; odd ^= 1);

        // Use or create temporary array b for merging
        int[] b;                 // temp array; alternates with a
        int ao, bo;              // array offsets from 'left'
        int blen = right - left; // space needed for b
        if (work == null || workLen < blen || workBase + blen > work.length) {
            work = new int[blen];
            workBase = 0;
        }
        if (odd == 0) {
            System.arraycopy(a, left, work, workBase, blen);
            b = a;
            bo = 0;
            a = work;
            ao = workBase - left;
        } else {
            b = work;
            ao = 0;
            bo = workBase - left;
        }

        // Merging
        for (int last; count > 1; count = last) {
            for (int k = (last = 0) + 2; k <= count; k += 2) {
                int hi = run[k], mi = run[k - 1];
                for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
                    if (q >= hi || p < mi && a[p + ao] <= a[q + ao]) {
                        b[i + bo] = a[p++ + ao];
                    } else {
                        b[i + bo] = a[q++ + ao];
                    }
                }
                run[++last] = hi;
            }
            if ((count & 1) != 0) {
                for (int i = right, lo = run[count - 1]; --i >= lo;
                    b[i + bo] = a[i + ao]
                );
                run[++last] = right;
            }
            int[] t = a; a = b; b = t;
            int o = ao; ao = bo; bo = o;
        }
    }

比较疑惑的地方就在于,他是如何进行长度判断的,又是如何检测数组的有序性的,是在排序前还是排序中呢,如果在排序后才知道数组是否有序,就没有意义了。

这里看源码

逻辑从上往下看:

第一步先以数组的长度为判断条件:

计算数组的长度容易:

直接right-left就可以了

那么这里的quicksort_threshold就是一个阈值

   static void sort(int[] a, int left, int right,
                     int[] work, int workBase, int workLen) {
        // Use Quicksort on small arrays
        if (right - left < QUICKSORT_THRESHOLD) {
            sort(a, left, right, true);
            return;
        }

 我们可以先看一下常量值:

Max_Run_Count是衡量有序性的,MAX_RUN_LENGTH是衡量重复重复元素的。

再回头看的话可以知道这个代码是长度小于这个286就直接采用双基准点快排了。

那么如果大于这个值呢?接着往下看

   /*
         * Index run[i] is the start of i-th run
         * (ascending or descending sequence).
         */
        int[] run = new int[MAX_RUN_COUNT + 1];
        int count = 0; run[0] = left;

run用来记录记录升序或者降序的起点 

// Check if the array is nearly sorted
for (int k = left; k < right; run[count] = k) {
    // 循环遍历数组中的元素,k 从左边界开始逐步向右移动
    if (a[k] < a[k + 1]) { // ascending
        // 如果当前元素小于下一个元素,说明当前区间是递增的
        while (++k <= right && a[k - 1] <= a[k]);
        // 继续移动 k 直到找到递增区间的结束位置
    } else if (a[k] > a[k + 1]) { // descending
        // 如果当前元素大于下一个元素,说明当前区间是递减的
        while (++k <= right && a[k - 1] >= a[k]);
        // 继续移动 k 直到找到递减区间的结束位置
        // 然后反转递减区间,将递减区间转换为递增区间
        for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
            int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
            // 交换递减区间中的元素,实现反转
        }
    } else { // equal
        // 如果当前元素等于下一个元素,说明当前区间是相等的
        for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
            // 继续移动 k 直到找到不相等的元素或者达到最大相等长度
            if (--m == 0) {
                // 如果重复元素超过阈值,算法会尝试通过不同的分区策略来处理。这些策略旨在提高排序的效率,尽可能地减少重复元素对排序性能的影响,这里的sort还需要进行源码查看,比较复杂。
                sort(a, left, right, true);
                return;
            }
        }
    }

    /*
     * The array is not highly structured,
     * use Quicksort instead of merge sort.
     */
    // 如果发现数组不是高度结构化的,即当前区间并不是递增或递减的
    if (++count == MAX_RUN_COUNT) {
        // 如果累积的 run 数达到了最大值
        sort(a, left, right, true);
        // 则认为数组无序,使用快速排序进行排序
        return;
    }
}

、

这段代码是来判断这个区间的有序度。

count值越多,说明这个越无序,如果无序的话,那么采用快排来进行排序。

否则接着往下看

if (run[count] == right++) { // The last run contains one element 这段代码在检查最后一个 run 是否只包含一个元素。run[count] 表示当前记录的最后一个 run 的起始索引位置。如果这个 run 的起始索引位置与 right 相等,即最后一个 run 只包含一个元素,那么 right++ 会使 right 增加 1,这是因为 right 之前可能已经增加过 1。然后 run[++count] = right; 将新的右边界 right 记录到 run 数组中,表示这个 run 的结束位置。这样做的目的是为了确保 run 数组中的所有 run 都是左闭右开的区间。

第二个是cout值没有发生变化,已经排好序了,直接返回即可。

   if (run[count] == right++) { // The last run contains one element
            run[++count] = right;
        } else if (count == 1) { // The array is already sorted
            return;
        }

那么最后一段代码则是归并排序了

  // Determine alternation base for merge
        byte odd = 0;
        for (int n = 1; (n <<= 1) < count; odd ^= 1);

        // Use or create temporary array b for merging
        int[] b;                 // temp array; alternates with a
        int ao, bo;              // array offsets from 'left'
        int blen = right - left; // space needed for b
        if (work == null || workLen < blen || workBase + blen > work.length) {
            work = new int[blen];
            workBase = 0;
        }
        if (odd == 0) {
            System.arraycopy(a, left, work, workBase, blen);
            b = a;
            bo = 0;
            a = work;
            ao = workBase - left;
        } else {
            b = work;
            ao = 0;
            bo = workBase - left;
        }

        // Merging
        for (int last; count > 1; count = last) {
            for (int k = (last = 0) + 2; k <= count; k += 2) {
                int hi = run[k], mi = run[k - 1];
                for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
                    if (q >= hi || p < mi && a[p + ao] <= a[q + ao]) {
                        b[i + bo] = a[p++ + ao];
                    } else {
                        b[i + bo] = a[q++ + ao];
                    }
                }
                run[++last] = hi;
            }
            if ((count & 1) != 0) {
                for (int i = right, lo = run[count - 1]; --i >= lo;
                    b[i + bo] = a[i + ao]
                );
                run[++last] = right;
            }
            int[] t = a; a = b; b = t;
            int o = ao; ao = bo; bo = o;
        }

数量大于快排阈值并且有序度比较高的情况会用到归并。

小总结

那么这里举了int的分析例子,最后附上一个参考表格。

排序目标条件采用算法
int[] long[] float[] double[]size < 47混合插入排序 (pair)
size < 286双基准点快排
有序度低双基准点快排
有序度高归并排序
byte[]size <= 29插入排序
size > 29计数排序
char[] short[]size < 47插入排序
size < 286双基准点快排
有序度低双基准点快排
有序度高归并排序
size > 3200计数排序
Object[]-Djava.util.Arrays.useLegacyMergeSort=true传统归并排序
TimSort

其中 TimSort 是用归并+二分插入排序的混合排序算法  

西门子828D/840DSL数控机床产量数据采集实战:手把手教你绕过授权限制(附Demo源码) 本文详细介绍了西门子828D/840DSL数控机床产量数据采集的实战技术,包括绕过授权限制的替代方案和实现方法。通过分析通信协议、配置参数和数据处理,提供了一套高效且合规的数据采集解决方案,并附有Demo源码,帮助技术人员快速上手。 阅读详情

相关推荐

agv调度系统3.0技术介绍

agv调度系统,穿梭车调度系统,调度系统技术介绍,教你做调度

持续分享调度系统开发过程 4866

【JAVA】jdk8 Stream 排序精通

因为对象比基本类型占用空间大,如果排完序之后再翻转,而同时数组长度比较大,那么就可能有性能问题,所以可以直接指定排序的方向,避免不必要的浪费。但是对于完全的数值比较,其实就按照默认的比较即可,给Stream 排序的值即可,特别是对象,只需要指定字段即可。jdk8的stream流能方便的排序,但是每次都要查资料,非常不方便,不确定,所以这次直接弄懂,不再迷茫。,字符串比较很简单,就是字符依次比较,从小到大,第一位相同比第二位,依次排序。因此对象排序,优先使用这样的方式去指定排序,特别是倒序的时候。

weixin_41979605的博客 6114

深入解析音频信号处理的核心算法——傅里叶变换、语音增强、回声消除与主动降噪

本文系统介绍了现代音频信号处理的核心技术。首先阐述傅里叶变换作为理论基础的重要性,它能将声音分解为频域成分。随后重点分析三大关键技术:语音增强利用谱减法、维纳滤波和深度学习从噪声中提取人声;回声消除采用自适应滤波器消除通话中的回声;主动降噪通过声波干涉原理抵消环境噪声。文章最后指出,这些技术在实际应用中协同工作,形成完整的音频处理链路,共同提升语音质量和听觉体验。随着算法进步和算力提升,音频处理技术正向着更智能、更高效的方向发展。

程序猿老樊的博客 1325

jdk8特性Collections.sort()的使用

jdk8

Venhoul的博客 914

4、基于抽象解释的静态分析器中的跟踪分区与ASTRÉE分析器解析

本博客探讨了基于抽象解释的静态分析器中的跟踪分区技术,并深入解析了ASTRÉE分析器的工作原理和应用。通过示例程序说明了跟踪分区如何提升分析精度,减少误报,以及ASTRÉE如何利用多种数值抽象域(如八角形域、浮点区间线性形式等)来处理复杂的嵌入式C程序。此外,还讨论了ASTRÉE的模块化设计、循环展开优化、用户断言与自动细化的局限性等内容,为保障嵌入式软件的安全性和可靠性提供了理论与实践支持。

kotlin6android的博客 117

uniapp微信小程序 - 解决苹果ios底部输入框被软键盘遮挡的问题,input/textarea底部输入框被弹出的软键盘挡住部分或全部遮住(解决uniApp小程序底部输入框,键盘弹起时页面整体上移

uniapp: IOS微信小程序输入框部分被软键盘遮挡问题,iOS微信小程序键盘弹出时输入框被挡住,uniapp小程序苹果IOS系统软键盘唤起导致底部输入框被遮挡的问题,ios 键盘弹出input输入框被遮挡,uniapp textarea输入框软键盘遮挡问题,苹果手机ios系统,解决uni-app微信小程序底部输入框,键盘弹起时页面整体上移 问题,关于手机端IOS系统微信中虚拟键盘遮挡input输入框问题的解决方案,uniapp使用输入框固定在底部键盘弹起把输入框挡住问题,安卓上没问题就苹果不行,仅ios

🏆 前端领域优质创作者 5594

JDK8 中Arrays.sort() 排序方法解读

根据前两个阈值QUICKSORT_THRESHOLD(286)和INSERTION_SORT_THRESHOLD(47),我们可以看到大多数情况下,排序方法的使用规则是这样的,我们规定需要排序的数组长度为n。时,查看源码实现,当数组长度n(right - left) < 3200 (COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR ) ,使用。简单来说,会先计算需要排序的数组长度为n,再根据n的大小及数组元素类型来决定使用什么排序。,反之,在小数组的情况下使用插入排序。

ka3p06的博客 998

【ELK】最新版ELK日志搜集,过滤与展示,手把手教你搭建企业级ELK日志平台

ELFK是一套完整的日志集中处理方案。 E:ElasticSearck ES 分布式索引型非关系数据库 存储logstash输出的日志 全文检索引擎,保存的格式是json格式 L:logstash 基于java语言开发的,数据收集引擎。日志的收集,可以对数据进行过滤,分析,汇总,以标准格式输出 K:Kiabana 是es的可视化工具。对es存储的数据进行可视化展示,分析和检索。 F: FileBeat是一个轻量级日志采集器,Filebeat属于Beats家族的6个成员之一。

景天科技苑 7万+

JDK8 常用的Stream流操作 方法

Stream流操作、Stream流map方法、Stream流排序、Stream流map和peek的区别、Stream流过滤filter、Stream创建集合、Stream和迭代器遍历集合。

肥宅友的博客 2342

你以为你懂 Java 反射?看了这篇源码分析,我发现我以前都错了

摘要:本文讲述了一次生产环境Metaspace内存溢出的故障排查经历。事故源于一个通用数据导出功能中频繁使用反射调用method.invoke(),触发了JVM的"膨胀机制":当同一Method对象调用超过15次时,JVM会动态生成GeneratedMethodAccessor类,导致Metaspace被撑爆。文章分析了问题根源在于循环中反复调用getMethods()创建新Method对象,并提出了三种解决方案:缓存Method对象、改用MapStruct/MethodHandle工具

BUG猿的博客 769

大模型LangChain面试题及参考答案(上)

明确的输入输出类型:函数参数需包含类型注解,返回值需定义清晰的数据结构(如JSON格式),便于LLM理解参数含义和调用方式。工具描述:通过文档字符串或独立的描述对象(如Tool类)说明函数的功能、参数用途及调用场景,供LLM判断是否需要调用。示例:定义一个计算两个数之和的工具函数@tool"""计算两个整数的和。参数:- a:第一个整数- b:第二个整数调用场景:当用户需要进行数值加法计算时使用。"""除了内置的。

大模型大数据攻城狮的专栏 1136

剖析JDK8中Arrays.sort底层原理

数组一进来,会碰到第一个阀值QUICKSORT_THRESHOLD(286),注解上说,小过这个阀值的进入Quicksort (快速排序),其实并不全是,点进去sort(a, left, right, true);方法: // Use Quicksort on small arrays if (right - left < QUICKSORT_THRESHOLD) { sort(a, left, right, true);

mocas_wang的博客 558

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JDK8中的Arrays.sort源码解析

在Java中总是能很方便的调用别人已经写好的方法,无论是导入的jar包还是JDK自带的工具包。就比如JDK中对数组的排序功能,只要是个数组传进去就能排序,这无疑是大大提高了开发的效率,流行的排序有很多,那它里面到底是用了哪一种排序?接下来对照源码分析一波~ sort支持各种各样类型数据数组的排序~ 我们就来看个int[ ]排序的源码叭,一进去是这样的~ 点进去~ 我也看不懂~但...

致宁的大博客! 835

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JDK8自带的两种排序Arrays.sort()和Collections.sort()

JDK8自带的两种排序 Arrays.sort和Collections.sort Arrays.cort()是数组的排序方法,Collections.sort()是集合的排序方法,两个方法我们在平时都经常用到,给我们带来了便利。 一、Arrays.cort() Arrays.sort(数组名); Arrays.sort(数组名 ,int fromIndex, int toIndex); 这两个方法在排序中用到的频率最高,默认是升序排序,当我们需要默认排序时,就需要花点功夫了。 Arrays.cort.

Milan_1in的博客 2553

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【jdk8源码】Arrays.sort插入排序,居然还可以成对插入

至此,我们学习完了传统插入排序和成对插入排序,可以看出成对插入排序的每次先插入较大的数,这样我们就可以确定另一个数肯定在插入位置的左侧,这种处理方式有点像TimSort排序中合并相邻部分的处理,先找到左边最大数在右边的位置,再找到右边最小数在左边的位置,然后只需合并这重合的部分就行了。因此它比传统的插入排序实现更快。 由于成对插入排序在循环寻找a1,a2位置的时候,没有对左边界做判断,因此这次要注意下标越界的问题。这次省去判断,对性能的提升也是有帮助的。

追梦 1585

JDK 1.8.0_92 Arrays.sort()方法不可用?【jdk1.8无法与myeclipse8.6匹配的问题】

JDK 1.8.0_92 Arrays.sort()方法不可用? https://www.zhihu.com/question/47579334

ly969434341的专栏 3251

jdk8 Arrays.sort()实现分析

Arrays.sort()根据所需要排序的数组的特点会选择不同的排序算法。 第一种情况,当被排序的数组长度小于47并且排序是从数组起始位置开始的时候,采用的排序方式是最简单的插入排序。 for (int i = left, j = i; i < right; j = ++i) { int ai = a[i + 1]; while (ai < a[j]) { ...

不说话装高手 773

剖析JDK8中Arrays.sort底层原理及其排序算法的选择 侵立删

写这篇文章的初衷,是想写篇Java和算法的实际应用,让算法不再玄乎,而Arrays.sort是很好的切入点,即分析Java的底层原理,又能学习里面的排序算法思想。希望能给在座各位在工作中或面试中一点帮助!转载请注明出处:Michael孟良 点进sort方法: // Use Quicksort on small arrays if (right - left < ...

心神沫沫的收藏 1115

JDK8中 Arrays.sort 底层排序算法的选择

追到底层源码分析一下: // Use Quicksort on small arrays if (right - left < QUICKSORT_THRESHOLD) { //QUICKSORT_THRESHOLD = 286 sort(a, left, right, true); return; } 数组一进来,会碰到第一个阀值QUICKSORT_THRESHOLD(=286),注解上说,小于这个阀值的进入Quicksort (快速排序),其实并不

qq_41547882的博客 416

JDK8中Arrays.sort底层排序算法的选择

//UseQuicksortonsmallarrays if(right-left<QUICKSORT_THRESHOLD){//QUICKSORT_THRESHOLD=286 sort(a,left,right,true);return; } 数组一进来,会碰到第一个阀值QUICKSOR...

atarik@163.com 2669

剖析JDK8中Arrays.sort底层原理及其排序算法的选择

写这篇文章的初衷,是想写篇Java和算法的实际应用,让算法不再玄乎,而Arrays.sort是很好的切入点,即分析Java的底层原理,又能学习里面的排序算法思想。希望能给在座各位在工作中或面试中一点帮助!转载请注明出处:Michael孟良 点进sort方法: // Use Quicksort on small arrays if (right - left &l...

wwwwww33的博客 337

java数组底层_剖析JDK8中Arrays.sort底层原理及其排序算法的选择

写这篇文章的初衷,是想写篇Java和算法的实际应用,让算法不再玄乎,而Arrays.sort是很好的切入点,即分析Java的底层原理,又能学习里面的排序算法思想。希望能给在座各位在工作中或面试中一点帮助!转载请注明出处:Michael孟良暂时网上看过很多JDK8中Arrays.sort的底层原理,有些说是插入排序,有些说是归并排序,也有说大于域值用计数排序法,否则就使用插入排序。。。其实不全对。让...

weixin_34673225的博客 536

基于jdk1.8的Arrays.sort()思维导图

学习中,如有错误请指出,谢谢。 源码待补充。思维导图只提供大概思路,毕竟是思维导图嘛(

weixin_42907817的博客 378

【萌姐讲底层原理】Arrays.sort & Collections.sort 底层原理

where Arrays和Collections 是JDK 中能实现排序的两个工具类,都来自java.util工具包 what Arrays.sort 主要用于数组排序,包括基本类型的数组和对象数组。 Collections.sort 对List等集合类进行排序. 底层实现(jdk1.8版本) Collections.sort 方法调用了list.sort方法 public static <T extends Comparable<? super T>> void sort(

脚踏实地,仰望星空 1483

对于JDK-Arrays.sort()的分析

032181@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。在这里插入代码片 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选

Serendipity_only的博客 108

Java源码分析——Arrays.sort()

    JDK8中Arrays.java这个类的代码咋一看很多,有5000多行。但是,里面有很多方法把基本类型(有的方法Boolean类型除外)全都实现了一遍。例如下面的排序算法sort。只要看懂了一个,其它的也就懂了,基本上是一样的,个别地方有差别。这样看下来,其实Array源码真正的内容就少了许多了。 public static void sort(int[] a){...} public...

NJU_ZJL的专栏 689
上一篇: 走进jvm之垃圾回收器篇
下一篇: ip地址开发场景问题
happystudy_neu
博客等级 码龄4年 1140粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值