Collections.sort()的分析
首先我们得说明在Collections里面有两个排序方法
public static <T> void sort(List<T> list, Comparator<? super T> c) public static <T extends Comparable<? super T>> void sort(List<T> list)
很清晰,第二个方法不需要传入比较器,但是传入的待排序的参数list必须实现Comparable接口。
我们目前就只看第二个sort。
Collections.java
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a); //标识1
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
从上面我们可以清晰的看到,首先将要排序的list转化成数组。
再对数组使用Arrays.sort进行排序。
Arrays.java
public static void sort(Object[] a) {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a);
else
ComparableTimSort.sort(a);
}
Arrays的排序,我们不必深究。
总而言之,代码运行标志1后,数组a已经是有序的了。
为什么要将list转化成数组呢?
因为java内部的排序就只有针对数组的。
那么后面的是干什么呢?(list.listIterator()部分及以后)
举个例子
原list 1 5 8 3 4 2 6
排序后的数组 1 2 3 4 5 6 8
ListIterator<T> i = list.listIterator();
上面的代码取得了原list的迭代器,然后不断的将排序后的数组替换进原list(这个过程就是不断的next移动标尺,放入,再移动..)。
那么改成这样如何呢?
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> List<T> sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
return (List<T>) Arrays.asList(a);
}
好理解了一下,不过额外生成了一个list。
真的是生成了一个list么?
Arrays.java
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
返回的是ArrayList!!!
换言之
List<Integer> a=new LinkedList<Integer>();
a.add(4);
a.add(7);
a.add(5);
a.add(6);
a.add(8);
a.add(2);
LinkedList<Integer> list=(LinkedList<Integer>) sort(a);
这样的代码就会出错!!!
Collections.sort()的分析的更多相关文章
- 5.4 集合的排序(Java学习笔记)(Collections.sort(),及Arrays.sort()底层分析)
1.Comparable接口 这个接口顾名思义就是用于排序的,如果要对某些对象进行排序,那么该对象所在的类必须实现 Comparabld接口.Comparable接口只有一个方法CompareTo() ...
- 转:浅析Collections.sort
浅析Collections.sort 问题引入 在之前的一次Java上机实习中,老师布置了一道很简单的题: 从控制台输入10个整数,对它们进行升序排序并输出. 考虑到只有10个数,需要比较的次 ...
- 关于Java中Collections.sort和Arrays.sort的稳定性问题
一 问题的提出 关于Java中Collections.sort和Arrays.sort的使用,需要注意的是,在本文中,比较的只有Collections.sort(List<T> ele ...
- 泛型的排序问题(Collections.sort及Comparable的应用)
一.前言 java中对泛型(集合类型)排序的问题,主要采用了两张方式一种是对要排序的实体类,实现Comparable接口,另一种方式,Collections集合工具类进行排序. 二.实现Comp ...
- Java Collections.sort方法对list集合排序
1.排序测试类 package com.ljq.test; import java.util.ArrayList; import java.util.Collections; import java. ...
- list集合的排序Comparator和Collections.sort
一个例子 package sortt; import java.util.ArrayList; import java.util.Collections; import java.util.Compa ...
- java中Collections.sort排序详解
Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...
- java Collections.sort()实现List排序自定义方法
方法一: package testSimple; import java.util.ArrayList; import java.util.Collections; import java.util. ...
- Java面试总结系列之Collections.sort()
面试中被问到,集合类中的排序方法是怎么实现的?没有回答上来,故而总结如下:你知道么? 前提:在eclipse中对于自己的代码可以通过按住Ctrl的同时单击名称跳入相应源码中.但eclipse默认没有添 ...
随机推荐
- springMVC源码分析--HandlerMethod
在之前的博客中我们已经接触过HandlerMethod,接下来我们简单介绍一下HandlerMethod,简单来说HandlerMethod包含的信息包括类.方法和参数的一个信息类,通过其两个构造函数 ...
- 递归dict
一个看起来非常酷的定义 class Example(dict): def __getitem__(self, item): try: return dict.__getitem__(self, ite ...
- JAVA面向对象-----包机制
JAVA面向对象-–包机制 问题: 当定义了多个类的时候,可能会发生类名的重复问题. 在java中采用包机制处理开发者定义的类名冲突问题. 怎么使用java的包机制呢? 1.使用package 关键字 ...
- MTK8127编译sdk出错解决方法
1.按照源码中sdk目录下的howto_build_SDK.txt参考文档的编译方式 $ cd ~/my-android-git $ . build/envsetup.sh $ lunch sd ...
- Java进阶(四十四)线程与进程的特征及区别
线程与进程的特征及区别 定义及特征 进程 指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令.数据和堆栈等组成的,是一个能独立运行的活动实体. 进程的特征: 1.动态性:进程的实质是 ...
- ROS_Kinetic_x ROS栅格地图庫 Grid Map Library
源自:https://github.com/ethz-asl/grid_map Grid Map Overview This is a C++ library with ROS interface t ...
- 阻尼回弹效果的ScrollView嵌套GridView
以前写过一篇带阻尼回弹效果的ScrollView,但是有些小问题,于是又重新整理了一下,这篇文章一是一个带阻尼的Scrollview,再个就是Scrollview嵌套GridView实现,而GridV ...
- Java基本语法-----java运算符的优先级与结合性
这是本人以前的上学期间java 运算符这块知识的总结的,截图存到了word里,大家将就看下吧(不会用Markdown的表格 不然就在写一遍了 T T). [正在看本人博客的这位童鞋,我看你气度不凡,谈 ...
- NV12和NV21转rgb
void NV21_T_RGB(unsigned int width , unsigned int height , unsigned char *yuyv , unsigned char *rgb) ...
- dbcp连接池不合理的锁导致连接耗尽
应用报错,表象来看是连接池爆满了. org.springframework.transaction.CannotCreateTransactionException: Could not open J ...