java集合sort底层实现_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
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()相关推荐
- Java面试总结系列之Collections.sort()
面试中被问到,集合类中的排序方法是怎么实现的?没有回答上来,故而总结如下:你知道么? 前提:在eclipse中对于自己的代码可以通过按住Ctrl的同时单击名称跳入相应源码中.但eclipse 默认没有 ...
- java 多态判断非空_Java 面试知识点解析基础知识
文本公众号来源: 我没有三颗心脏作者: 我没有三颗心脏 (一)Java 基础知识点 1)面向对象的特性有哪些? 答:封装.继承和多态(应要多算一个那就是抽象) 封装是指将对象的实现细节隐藏起来,然后通 ...
- Java分析MySQL的数据结构_Java面试解析总结:Java+Redis+数据库+算法与数据结构+分布式...
金九银十即将到来,给大家整理了今年来最经典的面试真题1000+道,每个题目都有详细的解答,收集了java基础.RabbitMQ,微服务.MySQL数据库.Java并发.JVM,Redis.设计模式,S ...
- java集合根据值排序_Java 8:对集合中的值进行排序
java集合根据值排序 意识到Java 8将在接下来的几周内发布其GA版本之后,我认为现在是时候来看看它了,在过去的一周里,我一直在阅读Venkat Subramaniam的书 . 我要讲的是第3章, ...
- Java集合框架底层原理
Java集合框架 Java集合框架 List集合 ArrayList底层实现原理 ArrayList数组扩容技术(数组拷贝) 扩容大小 查询和删除 集合中的泛型 LinkedList Vector 线 ...
- java 集合 自动排序的_java中的自动排序集合 ---- 20160809
TreeSet的实现: TreeMap实现: 需要注意: 1. 当利用comparator比较两个元素相等时,插入的时候会失败.而hashset是发现两个元素相等时,插入失败返回false.这说明可能 ...
- Java集合迭代器原理图解_Java Iterator接口遍历单列集合迭代器原理详解
这篇文章主要介绍了Java Iterator接口遍历单列集合迭代器原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Iterator接口概述 ...
- java集合set不能去重_java集合去重和排序
1.去重 1.1 for循环去重 for (int i = 0; i list.remove(j); j--; } } } 测试结果: ,感觉还是有点用的,感觉循环次数太多了,不推荐使用. List ...
- java集合框架的接口_Java集合框架之Collection接口详解
Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...
最新文章
- linux 脚本 alias,在shell脚本中使用alias别名
- sql 2005 新增的查看sql语句运行情况
- JZOJ__Day 9:【普及模拟】算法学习(sfxx)
- 2018蓝桥杯省赛---java---B---1(第几天)
- java面向对象中的抽象,类与对象
- mybatis使用过程遇到的一些问题及解决方法
- Python数据分析学习笔记:使用SciKit-Learn进行数据规范化
- java条件触发_java – 当给定75:android时,条件不会触发
- 猎人能单拿修理机器人图纸_南京创新周麒麟行:他们为铁路配备“体检”机器人...
- 【个人笔记】OpenCV4 C++ 快速入门 05课
- BZOJ2339[HNOI2011]卡农——递推+组合数
- 基础的风光摄影技术控制
- redhat linux 无线网卡,RedHat Linux 6.4安装RTL8188CUS无线网卡驱动
- mysql dual表用法_详解Oracle数据库中DUAL表的使用
- Excel怎样恢复科学计数法显示的数据
- 哪个软件能代替斐讯路由_斐讯路由(老版本无需登录)
- 手机品牌是否一定要自研芯片
- 大一c语言论文700字,我的拿手好戏小学作文700字优质作文5篇
- canvas实现动画 地球绕太阳公转 月球绕地球公转
- unity 自制摇杆