zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Aras学习笔记 (8) Aras一个Web站点下创建多个Instances
    WebAPI学习笔记(3)Asp.net调用WebAPI Post方法传递参数
    简单工厂模式
    工厂模式
    文件信息
    C#压缩解压zip 文件
    Creo 2.0 Toolkit 解锁的问题
    Dojo Grid结合Ajax用法
    Aras Innovator时间验证
    Aras Innovator获取项目任务序列号
  • 原文地址:https://www.cnblogs.com/RunForLove/p/4329378.html
Copyright © 2011-2022 走看看