java中数组和集合的装换(及排序)
1.集合转数组toArray的用法
ArrayList<Integer> a=new ArrayList<>(10); for(int i=0;i<10;i++) { a.add(i);} Integer[] d=a.toArray(new Integer[0]);
2.数组转集合,只能用List
List<Integer> c=(List<Integer>) Arrays.asList(d);
3.关于数组的复制copyOf
int a[]=new int[]{57,81,68,75,91}; int[] b=(int[])Arrays.copyOf(a,8); for(int j=0;j<b.length;j++)
{ System.out.print(b[j]+"\t"); }
4.System.arraycopy();
copyOf内部也是用的System.arraycopy();
//elementData:源数组;index:源数组中的起始位置;elementData:目标数组;index + 1:目标数组中的起始位置; size - index:要复制的数组元素的数量; System.arraycopy(elementData, index, elementData, index + 1, size - index);
5.subList方法:截取的新的List是持有原List的引用的
ArrayList<Integer> a=new ArrayList<>(10); for(int i=0;i<10;i++) { a.add(i);} List<Integer> b=a.subList(1,5);//1,2,3,4 b.remove(1);//1,3,4 a//0,1,3,4,5,6,7,8,9
6.Colletions.sort(list) 与 Arrays.sort(T[])
对于降序排列Arrays.sort(arr,Collections.reverseOrder());也可以自己重新写Comparator接口
Colletions.sort()实际会将list转为数组,然后调用Arrays.sort(),排完了再转回List。
JDK8里,List有自己的sort()方法了,像ArrayList就直接用自己内部的数组来排,而LinkedList, CopyOnWriteArrayList还是要复制出一份数组。
而Arrays.sort(),对原始类型(int[],double[],char[],byte[]),JDK6里用的是快速排序,对于对象类型(Object[]),JDK6则使用归并排序。
JDK7的进步
到了JDK7,快速排序升级为双基准快排(双基准快排vs三路快排);归并排序升级为归并排序的改进版TimSort,一个JDK的自我进化。
JDK8的进步
再到了JDK8, 对大集合增加了Arrays.parallelSort()函数,使用fork-Join框架,充分利用多核,对大的集合进行切分然后再归并排序,而在小的连续片段里,依然使用TimSort与DualPivotQuickSort。
TimSort:
Timsort是一种结合了归并排序和插入排序的混合算法。(相对有序的时候可以直接用插入排序,时间复杂度最优是O(n),最差是O(n*log2n))
1) 第一步就是把待排数组划分成一个个run,当然run不能太短,如果长度小于minrun这个阈值,则用插入排序进行扩充;
2) 第二步将run入栈,当栈顶的run的长度满足:runLen[n-2] <= runLen[n-1] + runLen[n]或者 runLen[n-1] <= runLen[n], 则对两个短run归并为一个新run,则到只剩栈顶元素时排序也完成了。
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/10529960.html