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,则到只剩栈顶元素时排序也完成了。

posted @ 2019-03-14 14:10  LeeJuly  阅读(201)  评论(0编辑  收藏  举报