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

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java Arrays.asList()与Arrays.sort()分析脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

声明

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

Array.asList()

// 示例 int[] arr = new int[5]; List<int[]> list = Arrays.asList(arr);  // Arrays.asList(a)源码 public static <T> List<T> 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在经典快排基础上改进,@R_650_1304@稳定为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/

脚本宝典总结

以上是脚本宝典为你收集整理的Java Arrays.asList()与Arrays.sort()分析全部内容,希望文章能够帮你解决Java Arrays.asList()与Arrays.sort()分析所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。