日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK源码解析 Comparator 中的策略模式

發布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 中的策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。