Java面试总结系列之Collections.sort()

面试中被问到,集合类中的排序方法是怎么实现的?没有回答上来,故而总结如下:你知道么?

前提:在eclipse中对于自己的代码可以通过按住Ctrl的同时单击名称跳入相应源码中。但eclipse默认没有添加java源代码目录,比如点击Thread会提示source not found,而在开发中了解Java源代码又是技术成长必要的。jdk默认是附带源码zip包的(jdk按装目录下的src.zip文件),我们可以通过添加源码在eclipse中查看。在提示source not found界面,点击Attach Source…->External File,在jdk目录下选择src.zip即可。(jdk目录可以在系统变量%JAVA_HOME%中查看)。

首先,代码如下:

import java.util.*;

public class Sort {

  public static void main(String args[]){  

     List list = new ArrayList();   

     list.add(123);   list.add(321);   list.add(87);   

     Collections.sort(list);   

     for(int i = 0;i <list.size();i++){    

      System.out.println(list.get(i));   

    }

   }

}

输出:

87
123
321

然后,我们来查看Collections.sort()方法,跳转到的代码如下:

public class collections{

  @SuppressWarnings("unchecked")
     public static <T extends Comparable<? super T>> void sort(List<T> list) {
          list.sort(null);
    }

}然后,我们点击list.sort()方法,跳转如下:

public interface List<E> extends Collection<E>{

      @SuppressWarnings({"unchecked", "rawtypes"})
      default void sort(Comparator<? super E> c) {    //jdk 1.8中新特性,接口中可以写方法实体,在方法前加default.
        Object[] a = this.toArray();
          Arrays.sort(a, (Comparator) c);
          ListIterator<E> i = this.listIterator();
          for (Object e : a) {
              i.next();
              i.set((E) e);
        }
    }

}然后,产生了疑问,在Collection.sort()方法中,list.sort(null)传入的是NULL,但是在list.sort()函数中,参数是default void sort(Comparator<? super E> c),然后ctrl点击Comparator,

 

然后,我们看到调用了Arrays.sort()方法,进入这个Arrays.sort()方法中,

public class Arrays{

  public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

}进入TimeSort.sort()方法:

class TimeSort{

  

 static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c, T[] work, int workBase, int workLen) {

        assert c != null && a != null && lo >= 0 && lo <= hi && hi <= a.length;

        int nRemaining  = hi - lo;        

  if (nRemaining < 2)               

  return;  // Arrays of size 0 and 1 are always sorted

      // If array is small, do a "mini-TimSort" with no merges        

  if (nRemaining < MIN_MERGE) {            

  int initRunLen = countRunAndMakeAscending(a, lo, hi, c);            

  binarySort(a, lo, hi, lo + initRunLen, c);            

  return;        

  }

}从这个我们看出,它的底层调用的是binarySort()方法来实现的。

 

 

其他优秀博客参考:(同样是对Collections.sort()的讲解)

1.http://trinea.iteye.com/blog/1248517

你可能感兴趣的:(Collections)