Collections,sort()实现原理
来源:互联网 发布:手机淘宝如何找明星店 编辑:程序博客网 时间:2024/06/05 03:54
查看源码可以发现Collections.sort的实现是Arrays.sort,而Arrays.sort的实现是ComparableTimSort.sort,然后才到sort方法和它的定义,查看排序的主体部分也可以发现一个binarySort的方法,这是排序方法的实现,是通过调用Object的CompareTo进行比较的。
每一步代码如下:
public class ListSort { public static void main(String[] args){ List<String> list=new ArrayList<String>(); list.add("ohjx"); list.add("ghjg"); list.add("hggh"); Collections.sort(list); for (String listString:list){ System.out.println(listString); } }}
Arrays.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]); }}ComparableTimSort.sort:
public static void sort(Object[] a) { if (LegacyMergeSort.userRequested) legacyMergeSort(a); else ComparableTimSort.sort(a);}
sort:
static void sort(Object[] a) { sort(a, 0, a.length);}static void sort(Object[] a, int lo, int hi) { rangeCheck(a.length, lo, hi); 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); binarySort(a, lo, hi, lo + initRunLen); return; }
binarySort:
private static void binarySort(Object[] a, int lo, int hi, int start) { assert lo <= start && start <= hi; if (start == lo) start++; for ( ; start < hi; start++) { @SuppressWarnings("unchecked") Comparable<Object> pivot = (Comparable) a[start]; // Set left (and right) to the index where a[start] (pivot) belongs int left = lo; int right = start; assert left <= right; /* * Invariants: * pivot >= all in [lo, left). * pivot < all in [right, start). */ while (left < right) { int mid = (left + right) >>> 1; if (pivot.compareTo(a[mid]) < 0) right = mid; else left = mid + 1; } assert left == right; /* * The invariants still hold: pivot >= all in [lo, left) and * pivot < all in [left, start), so pivot belongs at left. Note * that if there are elements equal to pivot, left points to the * first slot after them -- that's why this sort is stable. * Slide elements over to make room for pivot. */ int n = start - left; // The number of elements to move // Switch is just an optimization for arraycopy in default case switch (n) { case 2: a[left + 2] = a[left + 1]; case 1: a[left + 1] = a[left]; break; default: System.arraycopy(a, left, a, left + 1, n); } a[left] = pivot; }}
这就是层层调用的代码(按顺序)
Collections.sort方法如果只有一个参数,那么默认采用自然排序的方法对指定的列表(参数)进行排序,也可以传入两个参数,一个是待排序的列表,另一个就是指定的排序规则。两个方法的定义如下:
1 0
- Collections,sort()实现原理
- Arrays.sort和Collections.sort实现原理解析
- Arrays和Collections 对于sort的不同实现原理
- 实现Collections.sort方法
- 实现用Collections.sort(arg1,arg2)排序
- 用Collections.sort()实现按照首字母排序
- [java]_[Collections.sort()实现List排序]
- 应用 Collections.sort() 实现 List 排序
- Collections.sort()实现对List的排序
- Java实现距离排序【Collections.sort】
- Collections.sort
- Collections sort
- Collections.sort
- Collections-sort
- Collections.sort
- Collections.sort
- Arrays.sort()、Collections.sort()
- 集合(Collections-sort)-(Collections-max)-(Collections-binarySearch)
- 分组排序函数的用法
- 生成唯一订单号
- flume安装使用教程
- laravel的安装
- 模块列表中不存在此处理程序所需的指定模块,如果你添加脚本映射处理程序映射,则IsapiModule或CgiModule必须在模块列表中
- Collections,sort()实现原理
- 【jzoj100004】【Dice】【数学期望】
- QT 新增类,引用后报错:外部符合LINK2019
- 自动完成文本框的功能和用法 MultiAutoCompleteTextView setTokenizer()
- 【设计模式】行为型模式——策略模式(Strategy Pattern)
- spring配置eache缓存
- spring boot拾遗:启动
- 最大公约数,最小公倍数
- ES6(ES2015) -Generators