java8的各種集合類型排序,百萬性能壓力情況

背景

軟件開發中集合排序是比較強大的功能,程序員只要按規範編碼,輕鬆實現排序。

學習目標

  • 會利用集合Map,Set,list實現排序功能,知道匿名內部類Comparator【Comparator很關鍵】
  • 搞清楚集合排序的性能開銷
  • 排序遇到的坑,注意例子都是JDK1.8的

代碼例子

程序員上車學排序羅,先講Set吧,Set是無序的,但是TreeSet可以實現有序

TreeSet排序

java8的各種集合類型排序,百萬性能壓力情況

Map本身也是無序的,但TreeMap可以有序

TreeMap排序

java8的各種集合類型排序,百萬性能壓力情況

這裡簡單說下Set、Map排序的關係

TreeSet排序底層源碼其實利用TreeMap來實現的,【我Debug源碼才知道的】

看下面,這就是個TreeSet裡面的Map

java8的各種集合類型排序,百萬性能壓力情況

添加元素時會排序,底層會調用TreeMap的put

java8的各種集合類型排序,百萬性能壓力情況

TreeMap,TreeSet都是利用這個Comparator來把排序邏輯跟排序算法分離的,匿名內部類不清楚怎麼玩的,

就看看TreeMap、TreeSet的排序實現例子吧。

java8的各種集合類型排序,百萬性能壓力情況

List排序

java8的各種集合類型排序,百萬性能壓力情況

list排序還可以通過對象Content實現comparable接口,我就不演示了。一般開發用Comparator非常方便。

ArrayList排序源碼簡單分析

重點分析下ArrayList的排序,畢竟實戰開發用的最頻繁的就是他了。

到處都是泛型啊,邊看邊學吧上面例子的 Collections.sort其實底層調用的是ArrayList的Sort如下

java8的各種集合類型排序,百萬性能壓力情況

ArrayList源碼,有個判斷實現Comparable接口的走Sort方法,匿名內部類Comparator走TimSort

java8的各種集合類型排序,百萬性能壓力情況

來點語法糖吃吃

jdk1.8 lambda表達式,簡潔的很

java8的各種集合類型排序,百萬性能壓力情況

還有更簡潔的

java8的各種集合類型排序,百萬性能壓力情況

java8的各種集合類型排序,百萬性能壓力情況

排序的大坑

ArrayList排序例子,當排序的字段是Null時,Bug出現了

我故意把排序字段設置為Null,當然實際項目中遇到Null的概率不好說了。

java8的各種集合類型排序,百萬性能壓力情況

一般這樣判斷Null情況,JDK7及以上是不對的,

java8的各種集合類型排序,百萬性能壓力情況

會出現這樣的異常:違反了規範合同

排序算法TimeSort裡報的異常,當排序數據很少時,可能沒異常,我測試30條數據時才出了這樣異常。

java8的各種集合類型排序,百萬性能壓力情況

正確的判斷是這樣

java8的各種集合類型排序,百萬性能壓力情況

原因是

java8的各種集合類型排序,百萬性能壓力情況

總結

  • 1、實戰開發中能對Set、Map、List排序,搞懂Comparator匿名類的作用。
  • 2、排序的異常情況,一定要注意Null情況,當然你能保證排序字段一定不是Null那最好。
  • 3、注意你JDK版本,1.6不異常,不代表1.7,1.8不異常。

性能測試

【僅供參考】因為硬件、排序的數據位置不一樣,測試結果都不一樣。大家可以看看差異就可以。

初始化的數據我都是倒著排序的,Sort後變正排序

java8的各種集合類型排序,百萬性能壓力情況

又get到新知識的,請關注啊 原創是 @程序汪汪


分享到:


相關文章: