JDK源码解析 Comparator 中的策略模式
生活随笔
收集整理的這篇文章主要介紹了
JDK源码解析 Comparator 中的策略模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JDK源碼解析
Comparator?中的策略模式。在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);elseTimSort.sort(a, 0, a.length, c, null, 0, 0);}} }Arrays就是一個環境角色類,這個sort方法可以傳一個新策略讓Arrays根據這個策略來進行排序。
就比如下面的測試類。
public class demo {public static void main(String[] args) { ?Integer[] data = {12, 2, 3, 2, 4, 5, 1};// 實現降序排序Arrays.sort(data, new Comparator<Integer>() {public int compare(Integer o1, Integer o2) {return o2 - o1;}});System.out.println(Arrays.toString(data)); //[12, 5, 4, 3, 2, 2, 1]} }這里我們在調用Arrays的sort方法時,第二個參數傳遞的是Comparator接口的子實現類對象。
所以Comparator充當的是抽象策略角色,而具體的子實現類充當的是具體策略角色。
環境角色類(Arrays)應該持有抽象策略的引用來調用。
那么,Arrays類的sort方法到底有沒有使用Comparator子實現類中的?compare()?方法嗎?讓我們繼續查看TimSort類的?sort()?方法,
代碼如下:
class TimSort<T> {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 mergesif (nRemaining < MIN_MERGE) {int initRunLen = countRunAndMakeAscending(a, lo, hi, c);binarySort(a, lo, hi, lo + initRunLen, c);return;}...} private static <T> int countRunAndMakeAscending(T[] a, int lo, int hi,Comparator<? super T> c) {assert lo < hi;int runHi = lo + 1;if (runHi == hi)return 1; ?// Find end of run, and reverse range if descendingif (c.compare(a[runHi++], a[lo]) < 0) { // Descendingwhile (runHi < hi && c.compare(a[runHi], a[runHi - 1]) < 0)runHi++;reverseRange(a, lo, runHi);} else { // Ascendingwhile (runHi < hi && c.compare(a[runHi], a[runHi - 1]) >= 0)runHi++;} ?return runHi - lo;} }上面的代碼中最終會跑到?countRunAndMakeAscending()?這個方法中。
我們可以看見,只用了compare方法,
所以在調用Arrays.sort方法只傳具體compare重寫方法的類對象就行,
這也是Comparator接口中必須要子類實現的一個方法。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的JDK源码解析 Comparator 中的策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK源码解析 Runable是一个典型
- 下一篇: springcloud 与springb