List接口本身未提供sort的方法。

在jdk中提供了一个集合操作工具类Collections来操作集合。

查看Collections类,可以发下如下两个方法:

static

<T extends Comparable<? super T>>
void
sort(List<T> list)
根据元素的自然顺序 对指定列表按升序进行排序。
static

<T> void
sort(List<T> list,Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序。

第一个方法,是要求T必须实现Comparator接口。

第二个方法,传一个Comparator接口的实现。

打开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();for (int j=0; j<a.length; j++) {i.next();i.set((T)a[j]);}}

会发现,其实它调用的是Arrays.sort(Object[] a)这个方法,对对象排序。

Arrays类又是jdk为操作数组提供的一个工具类,里面提供了很多对数组的操作方法,如排序、查找等。

我们这里主要是对其中的sort方法进行一个简单的分析,打开Arrays类的sort实现代码,如下:

    public static void sort(Object[] a) {Object[] aux = (Object[])a.clone();mergeSort(aux, a, 0, a.length, 0);}

里面有调用了mergeSort这个方法对目标数组进行排序,单从方法的名字来看就知道是个归并排序,小弟之前也写过 java实现的归并排序,与这里略有不同,

此方法的代码如下:

 private static void mergeSort(Object[] src,Object[] dest,int low,int high,int off) {int length = high - low;// Insertion sort on smallest arraysif (length < INSERTIONSORT_THRESHOLD) {for (int i=low; i<high; i++)for (int j=i; j>low &&((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)swap(dest, j, j-1);return;}// Recursively sort halves of dest into srcint destLow  = low;int destHigh = high;low  += off;high += off;int mid = (low + high) >>> 1;mergeSort(dest, src, low, mid, -off);mergeSort(dest, src, mid, high, -off);// If list is already sorted, just copy from src to dest.  This is an// optimization that results in faster sorts for nearly ordered lists.if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {System.arraycopy(src, low, dest, destLow, length);return;}// Merge sorted halves (now in src) into destfor(int i = destLow, p = low, q = mid; i < destHigh; i++) {if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)dest[i] = src[p++];elsedest[i] = src[q++];}}

jdk里面对归并做了一个小小的改进,那就是当数组的长度于INSERTIONSORT_THRESHOLD(=7)这个常数的时候使用的是插入排序(Insertion sort )。

因为当数组元素较小时,比如6个,最好的情况下插入排序移动0次元素,最坏的情况是10次,而且归并则始终是nlogn,所以这是jdk做的一个小优化吧。

如果解释的不对的话请大家纠结,呵呵。

深入分析集合List的排序Collections.sort相关推荐

  1. JAVA-List排序-Collections.sort()-对象数组(集合)根据某一属性排序

    JAVA-List排序-Collections.sort() 当我们想对一个对象数组(集合)根据某一属性进行排序时,我们可以使用list中的Collection.sort(),这是一种较快捷的方式. ...

  2. JAVA对list集合进行排序Collections.sort()

    对一个集合中的对象进行排序,根据对象的某个指标的大小进行升序或降序排序.代码如下: // 进行降序排列Collections.sort(list, new Comparator<ResultTy ...

  3. 集合排序 Collections.sort用法

    大半夜,一同学来问这段代码.问了三个问题. 一,这个排序Sort()怎么用?  二,接口作为方法的参数是什么意思? 三,入参直接new Comparator(){}是怎么回事? 先回答第二,三个问题: ...

  4. ht-8 对arrayList中的自定义对象排序( Collections.sort(ListT list, Comparator? super T c))...

    1 package com.iotek.set; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import ja ...

  5. java List 排序 Collections.sort() 对 List 排序

    2019独角兽企业重金招聘Python工程师标准>>> //一个POJO例子 class User {  String name;  String age;    public Us ...

  6. list排序(Collections.sort())

    Collections.sort(userList, new Comparator<User>() {@Overridepublic int compare(User o1,User o2 ...

  7. Collections.sort()自定义排序方式

    Java中Collections.sort()的使用! 在日常开发中,很多时候都需要对一些数据进行排序的操作.然而那些数据一般都是放在一个集合中如:Map ,Set ,List 等集合中.他们都提共了 ...

  8. 怎么Collections.sort()方法进行List排序

    一.Collections.sort()从小到大排序:Collections.sort(list); List<Integer> list = new ArrayList<Integ ...

  9. Collections.sort对List排序的两种方法

    一.Collections.sort的简单使用 说到List的排序,第一反应当然是使用Collections.sort,方便简单.下面实现一下~~ private void sortStrings() ...

最新文章

  1. 日志库EasyLogging++学习系列(2)—— 日志级别
  2. 这个3月我有3场见面会,不知道你来不来?
  3. QT的QTechnique类的使用
  4. python数据分析和可视化——一篇文章足以(未完成)
  5. 左神算法:判断二叉树是否为平衡二叉树(树形dp套路,Java版)
  6. Python3.7模块之re
  7. 给UIWebView增加搜索栏
  8. mysql中什么叫临时表_MySQL中使用临时表需要注意哪些?
  9. mysql goldengate_goldengate同步mysql
  10. linux中,一个目录的权限是777,普通用户为什么删除不了它呢?
  11. 《C++程序设计POJ》《WEEK3 类和对象进阶》成员对象和封闭类/友元/this指针/常量成员函数...
  12. 12v直流电机并联多大电容_对电容的理解
  13. redis cluster(5)- redis集群原理
  14. 在开源中国众包那里放了一个东西
  15. JavaScript案例:页面自动跳转到首页
  16. 如何编写android ANE
  17. 用Python求解拿鸡蛋问题
  18. 数值分析基础工具使用Matlab绘制双曲线
  19. 双目视觉三维重构(一)————简介
  20. 4.11 51单片机-LCD1602显示屏

热门文章

  1. 融合莱维飞行与黄金正弦的蚁狮优化算法-附代码
  2. 基于WEB纯JAVA应用的框架太棒了-WUI
  3. 编译GDAL在win10适用VS2015(64位)
  4. 利用Python爬取网页美女图片,哇太多了,我U盘装满了!
  5. 低技术、不联网、简单用——防疫“两码”横向五合一拼图电脑端解决方案
  6. python怎在excel-Python操作Excel之xlsx文件
  7. 联想台式机天启M4500忘记BIOS密码
  8. 006永磁电机永磁体的类型:何为凸极性、隐极性,表贴式、内置式,傻瓜式讲解,专为零基础编写。
  9. 医学图像 | 使用深度学习实现乳腺癌分类(附python演练)
  10. win7映射网络驱动器消失了_win7系统无法映射网络驱动器的解决方法