标签:迭代器 arraylist collections sort
首先我们得说明在Collections里面有两个排序方法public static <T> void sort(List<T> list, Comparator<? super T> c) public static <T extends Comparable<? super T>> void sort(List<T> list)很清晰,第二个方法不需要传入比较器,但是传入的待排序的参数list必须实现Comparable接口。
Collections.java public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] a = list.toArray(); Arrays.sort(a); //标识1 ListIterator<T> i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set((T)a[j]); } }从上面我们可以清晰的看到,首先将要排序的list转化成数组。
Arrays.java public static void sort(Object[] a) { if (LegacyMergeSort.userRequested) legacyMergeSort(a); else ComparableTimSort.sort(a); }Arrays的排序,我们不必深究。
ListIterator<T> i = list.listIterator();上面的代码取得了原list的迭代器,然后不断的将排序后的数组替换进原list(这个过程就是不断的next移动标尺,放入,再移动..)。
@SuppressWarnings("unchecked") public static <T extends Comparable<? super T>> List<T> sort(List<T> list) { Object[] a = list.toArray(); Arrays.sort(a); return (List<T>) Arrays.asList(a); }好理解了一下,不过额外生成了一个list。
Arrays.java public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }返回的是ArrayList!!!
List<Integer> a=new LinkedList<Integer>(); a.add(4); a.add(7); a.add(5); a.add(6); a.add(8); a.add(2); LinkedList<Integer> list=(LinkedList<Integer>) sort(a);这样的代码就会出错!!!
标签:迭代器 arraylist collections sort
原文地址:http://blog.csdn.net/dlf123321/article/details/44059273