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 <list.size();i++){

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

    }

   }

}

输出:

87
123
321

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

public class collections{

  @SuppressWarnings("unchecked")
     public static <T extends Comparable<? super T>> void sort(List<T> list) {
          list.sort(null);
    }

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

public interface List<E> extends Collection<E>{

      @SuppressWarnings({"unchecked", "rawtypes"})
      default void sort(Comparator<? super E> c) {    //jdk 1.8中新特性,接口中可以写方法实体,在方法前加default.
        Object[] a = this.toArray();
          Arrays.sort(a, (Comparator) c);
          ListIterator<E> 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 <T> 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 <T> 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

时间: 2024-10-10 07:17:34

Java基础集合类总结之Collections.sort()的相关文章

Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)

一.Comparable接口, Collections类 List的常用算法: sort(List); 排序,如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个类大小的方法 shuffle(List); 随机排列 void reverse(List); 逆序排列(Linked效率较高) copy(); 复制集合, 前提是size()相同(长度, 和容量的区别) fill(List, Object);使用某个对象填充整个List binarySearch()

黑马程序员——Java基础——集合类

第一讲 集合 一.集合的概念: 集合时一种容器,长度可变,可以存储任意类型的对象,基本数据类型也能够装入,是因为其内部是先自动装箱包装成包装类对象,然后存入集合的: 对比数组:也是容器,长度固定,只能存储基本数据类型 二.集合的分类 主要掌握的集合: Collection List: |--ArrayList:底层的数据结构使用的是数组结构:查询快,增删慢,不同步 |-LinkedList:底层的数据结构使用的是链式结构:查询慢,增删快    |-Vector:底层数组结构:同步  Set: |

java基础集合类——ArrayList 源码略读

ArrayList是java的动态数组,底层是基于数组实现. 1. 成员变量 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { /** * The maximum size of array to allocate. * Some VMs reserve some header word

jdk7 中Collections.sort 异常

Collections.sort 异常 java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:868) at java.util.TimSort.mergeAt(TimSort.java:485) at java.util.TimSort.mergeForceCollapse(TimSort.jav

Java基础集锦——利用Collections.sort方法对list排序

要想对List进行排序,可以让实体对象实现Comparable接口,重写compareTo方法即可实现按某一属性排序,但是这种写法很单一,只能按照固定的一个属性排序,没变法变化.通过下面这种方法,可以动态的指定List按照某一个属性进行排序,例子很简单,看代码就明白了. import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; publ

java基础——Collections.sort的两种用法

Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式: public static <T extends Comparable<? super T>> void sort(List<T> list) { list.sort(null); } public static <T> void sort(List<T> list, Comparator<? super T> c) {

JAVA基础【集合类与排序】

本章主题:在本章之中,对java集合  Collections.sort方法做一个简要的回顾. package test; /**  * @author Yshuai  * @version 创建时间:2014-08-20 上午09:49:36  */ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class 

Java Collections.sort方法对list集合排序

1.排序测试类 package com.ljq.test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class UserSort { public static void main(String[] args) { List<User> userList =new ArrayList<User&g

java Collections.sort()实现List排序自定义方法

方法一: package testSimple; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class testCollectionSort { public static void main(String[] args) { List<TblPowerGroup> list = new ArrayLis