Collections.sort的源码问题

问题描述

Collections.sort的源码问题
public static <T extends Comparable<? super T>> void sort(List<T> list) {
    Object[] a = list.toArray();
    Arrays.sort(a);
    ListIterator<T> i = list.listIterator();   //AAA
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }
}

上面的为Collections.sort的源码
我改写成了如下的形式
@SuppressWarnings("unchecked")
public static > List sort(List list) {
Object[] a = list.toArray();
Arrays.sort(a);
return (List) Arrays.asList(a);
}
总而言之
ListIterator i = list.listIterator(); //AAA
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
这部分有意思吗? 这不是把简单的问题变复杂了吗?

解决方案

原方法节省了空间

而且通用于list的各种实现

你的返回类型为ArrayList

解决方案二:

你的代码返回排序后的列表,原始的代码对原来的list排序,两者没有可比性。

解决方案三:

经过你改写后,返回的是一个新创建定长的java.util.Arrays.ArrayList,不能添加或删除元素
而原方法返回类型为void,在没有新创建List对象的前提下,对参数List中元素进行了排序,性能较高

解决方案四:

原方法节省了空间

而且通用于list的各种实现

你的返回类型为ArrayList

时间: 2025-01-01 14:09:01

Collections.sort的源码问题的相关文章

知无涯之std::sort源码剖析

从事程序设计行业的朋友一定对排序不陌生,它从我们刚刚接触数据结构课程开始便伴随我们左右,是需要掌握的重要技能.任何一本数据结构的教科书一定会介绍各种各样的排序算法,比如最简单的冒泡排序.插入排序.希尔排序.堆排序等.在现已知的所有排序算法之中,快速排序名如其名,以快速著称,它的平均时间复杂度可以达到O(N logN),是最快排序算法之一. 背景 在校期间,为了掌握这些排序算法,我们不得不经常手动实现它们,以加深对其的理解.然而这些算法实在是太常用了,我们不太可能在每次需要时都手动来实现,不管是性

dojo/query源码解析

dojo/query模块是dojo为开发者提供的dom查询接口.该模块的输出对象是一个使用css选择符来查询dom元素并返回NodeList对象的函数.同时,dojo/query模块也是一个插件,开发者可以使用自定义的查询引擎,query模块会负责将引擎的查询结果包装成dojo自己的NodeList对象. require(["dojo/query!sizzle"], function(query){ query("div")... 要理解这个模块就要搞清楚两个问题:

ArrayList源码分析(jdk1.8)

前几天自我学习了ArrayList的源码,写了篇云笔记,现将其发布到博客,供大家学习交流,本人并非大神,如有任何问题,欢迎批评指正. 最初是看了这篇文章http://www.cnblogs.com/hzmark/archive/2012/12/20/ArrayList.html,不过是基于jdk1.6的,遂自己分析源码并写下此文,在此表示感谢.转载请注明出处,谢谢,http://blog.csdn.net/u010887744/article/details/49496093. ArrayLis

从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)

原文:从零开始编写自己的C#框架(6)--SubSonic3.0插件介绍(附源码) 前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一次出来,而不是使用复制粘贴),这样对你理解后面的章节会有较好的帮助,如果你对我这种书写方式有什么建议或支持,也希望在评论中留言,谢谢你的支持.   SubSonic3.0简介 SubSonic是Rob Conery用

SpringMVC源码总结(一)HandlerMapping和HandlerAdapter入门

刚接触SpringMVC,对它的xml文件配置一直比较模模糊糊,最近花了一点时间稍微看了下源代码,再加上调试,开始逐渐理解它,网上的类似的内容有很多,写本文主要是自己加深一下理解.本文适合用过SpringMVC的开发者,言归正传,首先搭建一个最简单的工程体验一下.  该工程是基于maven的,pom配置不再说明,所使用的spring版本4.0.5.  首先是web.xml文件配置,最简单的配置  ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <!DOCT

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码]

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码] 似乎我们需要更多的模块了,我们有一个样例程序,可以帮助我们以后的系统开发做很多对照,我们稍后还有系统日志和系统异常的记录,这时浏览发生了困难,我们这一节来完成一个大家比较喜欢的东西吧,系统菜单栏,我们系统左边预留了一个位置,那里存放菜单,菜单在这里主要可以分为两种, 1. outlook模式,可以用easyui的accordion,做起来可以很漂亮,博客园很多人写的系统,我

深入JUnit源码之Runner

初次用文字的方式记录读源码的过程,不知道怎么写,感觉有点贴代码的嫌疑.不过中间还是加入了一些自己的理解和心得,希望以后能够慢慢的改进,感兴趣的童鞋凑合着看吧,感觉JUnit这个框架还是值得看的,里面有许多不错的设计思想在,更何况它是Kent Beck和Erich Gamma这样的大师写的..... 写在前面的话 不知道是因为第一份工作的影响还是受在博客园上看到的那句"源代码里没有秘密"的影响,总之,近来对很多框架的源码都很感兴趣,拿到一个都想看看.其实自从学习Java以来也看过不少了,

SpringMVC源码解读之HandlerMapping - AbstractUrlHandlerMapping系列request分发_java

AbstractHandlerMapping实现HandlerMapping接口定的getHandler 1. 提供getHandlerInternal模板方法给子类实现      2. 如果没有获取Handler,则使用默认的defaultHandler 3. 如果handler是string类型,从context获取实例 4. 通过getHandlerExecutionChain封装handler,添加interceptor // AbstractHandlerMapping /** * L

android-使用环信SDK开发即时通信功能(附源码下载)_Android

最近项目中集成即时聊天功能,挑来拣去,最终选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁,说明文档清晰易懂.文档有Android.iOS.和后台服务器端,还是非常全的.  环信官网:http://www.easemob.com/ 本篇文章目的主要在于说明环信Demo如何实现即时通信的.我在集成环信SDK到我们自己开发的app之前,研究了一下环信demo的代码,看了两三天的样子,基本搞清楚来龙去脉,但是只是清楚来龙去脉,要说到里面的细节可能得深一步研究,但是这就够了,已经可以把dem