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

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

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

}

}

}

输出:

87

123

321

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

public class collections{

@SuppressWarnings("unchecked")

public static > void sort(List list) {

list.sort(null);

}

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

public interface List extends Collection{

@SuppressWarnings({"unchecked", "rawtypes"})

default void sort(Comparator super E> c) {    //jdk 1.8中新特性,接口中可以写方法实体,在方法前加default.

Object[] a = this.toArray();

Arrays.sort(a, (Comparator) c);

ListIterator 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 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 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集合sort底层实现_Java面试总结系列之Collections.sort()相关推荐

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

    面试中被问到,集合类中的排序方法是怎么实现的?没有回答上来,故而总结如下:你知道么? 前提:在eclipse中对于自己的代码可以通过按住Ctrl的同时单击名称跳入相应源码中.但eclipse 默认没有 ...

  2. java 多态判断非空_Java 面试知识点解析基础知识

    文本公众号来源: 我没有三颗心脏作者: 我没有三颗心脏 (一)Java 基础知识点 1)面向对象的特性有哪些? 答:封装.继承和多态(应要多算一个那就是抽象) 封装是指将对象的实现细节隐藏起来,然后通 ...

  3. Java分析MySQL的数据结构_Java面试解析总结:Java+Redis+数据库+算法与数据结构+分布式...

    金九银十即将到来,给大家整理了今年来最经典的面试真题1000+道,每个题目都有详细的解答,收集了java基础.RabbitMQ,微服务.MySQL数据库.Java并发.JVM,Redis.设计模式,S ...

  4. java集合根据值排序_Java 8:对集合中的值进行排序

    java集合根据值排序 意识到Java 8将在接下来的几周内发布其GA版本之后,我认为现在是时候来看看它了,在过去的一周里,我一直在阅读Venkat Subramaniam的书 . 我要讲的是第3章, ...

  5. Java集合框架底层原理

    Java集合框架 Java集合框架 List集合 ArrayList底层实现原理 ArrayList数组扩容技术(数组拷贝) 扩容大小 查询和删除 集合中的泛型 LinkedList Vector 线 ...

  6. java 集合 自动排序的_java中的自动排序集合 ---- 20160809

    TreeSet的实现: TreeMap实现: 需要注意: 1. 当利用comparator比较两个元素相等时,插入的时候会失败.而hashset是发现两个元素相等时,插入失败返回false.这说明可能 ...

  7. Java集合迭代器原理图解_Java Iterator接口遍历单列集合迭代器原理详解

    这篇文章主要介绍了Java Iterator接口遍历单列集合迭代器原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Iterator接口概述 ...

  8. java集合set不能去重_java集合去重和排序

    1.去重 1.1 for循环去重 for (int i = 0; i list.remove(j); j--; } } } 测试结果: ,感觉还是有点用的,感觉循环次数太多了,不推荐使用. List ...

  9. java集合框架的接口_Java集合框架之Collection接口详解

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

最新文章

  1. linux 脚本 alias,在shell脚本中使用alias别名
  2. sql 2005 新增的查看sql语句运行情况
  3. JZOJ__Day 9:【普及模拟】算法学习(sfxx)
  4. 2018蓝桥杯省赛---java---B---1(第几天)
  5. java面向对象中的抽象,类与对象
  6. mybatis使用过程遇到的一些问题及解决方法
  7. Python数据分析学习笔记:使用SciKit-Learn进行数据规范化
  8. java条件触发_java – 当给定75:android时,条件不会触发
  9. 猎人能单拿修理机器人图纸_南京创新周麒麟行:他们为铁路配备“体检”机器人...
  10. 【个人笔记】OpenCV4 C++ 快速入门 05课
  11. BZOJ2339[HNOI2011]卡农——递推+组合数
  12. 基础的风光摄影技术控制
  13. redhat linux 无线网卡,RedHat Linux 6.4安装RTL8188CUS无线网卡驱动
  14. mysql dual表用法_详解Oracle数据库中DUAL表的使用
  15. Excel怎样恢复科学计数法显示的数据
  16. 哪个软件能代替斐讯路由_斐讯路由(老版本无需登录)
  17. 手机品牌是否一定要自研芯片
  18. 大一c语言论文700字,我的拿手好戏小学作文700字优质作文5篇
  19. canvas实现动画 地球绕太阳公转 月球绕地球公转
  20. unity 自制摇杆

热门文章

  1. 【总结整理】《人人都是产品经理》---读后感
  2. #51CTO学院四周年#其实、其实,我就是来吐槽的”
  3. 数据库如何闪回到某个时间点?
  4. ocjp 31-40
  5. 使用MSBuild实现完整daily build流程 .
  6. AT89C51 单片机在电话远程控制器中的应用
  7. JavaScript tips and tricks - 4
  8. 用了ReSharpe硬是爽
  9. 算法提高课-图论-单源最短路的建图方式-AcWing 1128. 信使:dijkstra、 最短路取最大值
  10. 通信原理-随相数字信号的最佳接收