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
或者指定个数的对象转换为list
;list
是Arrays
的内部类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/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。