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

前提:在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

Java面试总结系列之Collections.sort()的更多相关文章

  1. Java面试炼金系列 (1) | 关于String类的常见面试题剖析

    Java面试炼金系列 (1) | 关于String类的常见面试题剖析 文章以及源代码已被收录到:https://github.com/mio4/Java-Gold 0x0 基础知识 1. '==' 运 ...

  2. 5.4 集合的排序(Java学习笔记)(Collections.sort(),及Arrays.sort()底层分析)

    1.Comparable接口 这个接口顾名思义就是用于排序的,如果要对某些对象进行排序,那么该对象所在的类必须实现 Comparabld接口.Comparable接口只有一个方法CompareTo() ...

  3. Java面试宝典系列之基础排序算法

    本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...

  4. 200个最常见的JAVA面试问题(附答案)

    本文内容: 20个最常见的JAVA面试问题(附答案) 13个单例模式JAVA面试问题(附答案) 说说JVM和垃圾收集是如何工作的(附答案) 说说如何避免JAVA线程死锁(附答案) Java中HashS ...

  5. Java—集合框架 Collections.sort()、Comparable接口和Comparator接口

    Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...

  6. Java Collections.sort方法对list集合排序

    1.排序测试类 package com.ljq.test; import java.util.ArrayList; import java.util.Collections; import java. ...

  7. java中Collections.sort排序详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...

  8. java Collections.sort()实现List排序自定义方法

    方法一: package testSimple; import java.util.ArrayList; import java.util.Collections; import java.util. ...

  9. python 中的sort 和java中的Collections.sort()函数的使用

    x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...

随机推荐

  1. 合法提交Html标签 Page指令

    3.2.1 提交合法的HTML标签(1) 有时候我们需要让我们提交的文本展示出来的效果非常美观,通常会对服务器提交一些HTML标签来控制文本或内容的样式. HTML标签可能包含了很多不安全的因素,所以 ...

  2. Atitit apache 和guava的反射工具

    Atitit apache 和guava的反射工具 apache1 Spring的反射工具类 ReflectionUtils1 Guava 反射工具2 apache  34             7 ...

  3. 《轻量级Java Web整合开发入门SSH》 - 快速理解Java框架的又一积木

           学习JAVA不难,难的是没有多余的时间给你仔细学习.       伴随着项目的不断跟进,责任重于泰山,必须快速提升.       我不能期望把一本书或者一个项目完全吃透,只希望能用数量去 ...

  4. fir.im Weekly - iOS 保持界面流畅的技巧

    生命不息,coding 不止.本期 fir.im Weekly 收集了微博上的热转资源,包含 Android.iOS 开发工具.源码分享,产品 UI 设计的好文章,还有一些程序员成长的 Tips,希望 ...

  5. 学习ASP.NET MVC(八)——“Code First Migrations ”工具

    在本篇文章中,我们学习如何使用实体框架的“Code First Migrations ”(也称为代码先行功能)工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 默认情 ...

  6. 第四节:Vue表单标签和组件的基本用法,父子组件间的通信

    vue表单标签和组件的基本用法,父子组件间的通信,直接看例子吧. <!DOCTYPE html> <html> <head> <meta charset=&q ...

  7. 在Ubuntu搭建.NET Core环境

    Ubuntu16.04配置.net core环境   Ubuntu 16.04 desktop下载地址:http://www.ubuntu.com/desktop 本次是用vmware安装该系统.   ...

  8. 谈谈java的运行机制

    1.高级语言的运行机制 我们编程都是用的高级语言(写汇编和机器语言的大牛们除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行高级语言所编写的 ...

  9. wangEditor——轻量级web富文本框

    提示:最新版wangEditor请参见  http://www.wangeditor.com/  和   https://github.com/wangfupeng1988/wangEditor 交流 ...

  10. android 手机开启debug日志

    来自 http://blog.csdn.net/aikongmeng/article/details/9764297 真机默认是不开启Log 开关的,这么来说我们如果使用真机来搞程序测试的话,需要做以 ...