资讯专栏INFORMATION COLUMN

Java Arrays.asList()与Arrays.sort()分析

pkhope / 2076人阅读

摘要:与分析声明文章均为本人技术笔记,转载请注明出处示例源码将数组或者指定个数的对象转换为是的内部类实例,与不是一回事,长度固定,只能遍历访问,不能使用修改集合相关的方法,比如方法会抛出异常适配器模式修改数组内容后,内容也会随之改变,体现适配器模

Java Arrays.asList()与Arrays.sort()分析 声明

文章均为本人技术笔记,转载请注明出处https://segmentfault.com/u/yzwall

Array.asList()
// 示例
int[] arr = new int[5];
List list = Arrays.asList(arr);

// Arrays.asList(a)源码
public static  List asList(T... a) {
    return new ArrayList<>(a);
}

Arrays.asList(arr)将数组arr或者指定个数的对象转换为listlistArrays的内部类ArrayList实例(ArrayList<>(a)),与java.util.ArrayList不是一回事),长度固定,只能遍历访问,不能使用修改集合相关的方法,比如add/remove/clear方法会抛出UnsupportedOperationException异常;
适配器模式:修改数组arr内容后,list内容也会随之改变,体现适配器模式(只转换借款,后台数据仍然是数组)

Arrays.sort() 针对基本数据类型:DualPivotQuickSort

针对基本数据类型,Array.sort()采用DualPivotQuickSort算法排序;

DualPivotQuickSort基本流程:

元素个数:不超过插入排序阈值(默认47),选用插入排序;

元素个数:插入排序阈值-快排阈值(默认286),选用DualPivotQuickSort

元素个数:超过快排阈值,选用TimSort归并排序;

DualPivotQuickSort性能

DualPivotQuickSort在经典快排基础上改进,时间复杂度稳定为O(n logn)

针对Object类型和泛型:TimSort TimSort基本流程

用户通过系统参数LegacyMergeSort.userRequested选定排序方式:

LegacyMergeSort.userRequested为TRUE,进行经典二路归并;

LegacyMergeSort.userRequested为FALSE,进行TimSort归并排序;

TimSort性能

TimSort算法平均时间复杂度为O(n logn),最优情况下为O(n)好于经典归并排序O(n logn),空间复杂度与经典归并排序一样均为O(n)
因此在JDK1.8中,Java对对象和泛型使用TimSort的原因是:

TimSort性能稳定,而快速排序不稳定;

TimSort最优情况下时间复杂度为O(n)好于经典归并排序O(n logn)

参考

[1] https://zongwenlong.github.io/2017/01/06/Java-SourceCode-Sort/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67078.html

相关文章

  • Java 8 Stream并行流

    摘要:实际上,在并行流上使用新的方法。此外,我们了解到所有并行流操作共享相同的范围。因此,您可能希望避免实施慢速阻塞流操作,因为这可能会减慢严重依赖并行流的应用程序的其他部分。 流可以并行执行,以增加大量输入元素的运行时性能。并行流ForkJoinPool通过静态ForkJoinPool.commonPool()方法使用公共可用的流。底层线程池的大小最多使用五个线程 - 具体取决于可用物理C...

    yzd 评论0 收藏0
  • Java Lambda表达式入门

    摘要:表达式还增强了集合库。和前面的示例一样先使用匿名内部类来排序然后再使用表达式精简我们的代码。使用旧的方式代码如下所示使用匿名内部类根据排序使用可以通过下面的代码实现同样的功能使用排序也可以采用如下形式其他的排序如下所示。 本文转自:http://blog.csdn.net/renfufei...转载请注明出处 原文链接: Start Using Java Lambda Expressi...

    youkede 评论0 收藏0
  • Start Using Java Lambda Expressions(转载)

    摘要:原文 Introduction (Business Case) Lambda expressions are a new and important feature included in Java SE 8. A lambda expression provides a way to represent one method interface using an expression...

    FullStackDeveloper 评论0 收藏0
  • Java 性能调优指南之 Java 集合概览

    摘要:单线程集合本部分将重点介绍非线程安全集合。非线程安全集合框架的最新成员是自起推出的。这是标准的单线程阵营中唯一的有序集合。该功能能有效防止运行时造型。检查个集合之间不存在共同的元素。基于自然排序或找出集合中的最大或最小元素。 【编者按】本文作者为拥有十年金融软件开发经验的 Mikhail Vorontsov,文章主要概览了所有标准 Java 集合类型。文章系国内 ITOM 管理平台 O...

    gnehc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<