背景
軟件開發中集合排序是比較強大的功能,程序員只要按規範編碼,輕鬆實現排序。
學習目標
- 會利用集合Map,Set,list實現排序功能,知道匿名內部類Comparator【Comparator很關鍵】
- 搞清楚集合排序的性能開銷
- 排序遇到的坑,注意例子都是JDK1.8的
代碼例子
程序員上車學排序羅,先講Set吧,Set是無序的,但是TreeSet可以實現有序
TreeSet排序
Map本身也是無序的,但TreeMap可以有序
TreeMap排序
這裡簡單說下Set、Map排序的關係
TreeSet排序底層源碼其實利用TreeMap來實現的,【我Debug源碼才知道的】
看下面,這就是個TreeSet裡面的Map
添加元素時會排序,底層會調用TreeMap的put
TreeMap,TreeSet都是利用這個Comparator來把排序邏輯跟排序算法分離的,匿名內部類不清楚怎麼玩的,
就看看TreeMap、TreeSet的排序實現例子吧。
List排序
list排序還可以通過對象Content實現comparable接口,我就不演示了。一般開發用Comparator非常方便。
ArrayList排序源碼簡單分析
重點分析下ArrayList的排序,畢竟實戰開發用的最頻繁的就是他了。
到處都是泛型啊,邊看邊學吧上面例子的 Collections.sort其實底層調用的是ArrayList的Sort如下
ArrayList源碼,有個判斷實現Comparable接口的走Sort方法,匿名內部類Comparator走TimSort
來點語法糖吃吃
jdk1.8 lambda表達式,簡潔的很
還有更簡潔的
排序的大坑
ArrayList排序例子,當排序的字段是Null時,Bug出現了
我故意把排序字段設置為Null,當然實際項目中遇到Null的概率不好說了。
一般這樣判斷Null情況,JDK7及以上是不對的,
會出現這樣的異常:違反了規範合同
排序算法TimeSort裡報的異常,當排序數據很少時,可能沒異常,我測試30條數據時才出了這樣異常。
正確的判斷是這樣
原因是
總結
- 1、實戰開發中能對Set、Map、List排序,搞懂Comparator匿名類的作用。
- 2、排序的異常情況,一定要注意Null情況,當然你能保證排序字段一定不是Null那最好。
- 3、注意你JDK版本,1.6不異常,不代表1.7,1.8不異常。
性能測試
【僅供參考】因為硬件、排序的數據位置不一樣,測試結果都不一樣。大家可以看看差異就可以。
初始化的數據我都是倒著排序的,Sort後變正排序
又get到新知識的,請關注啊 原創是 @程序汪汪
閱讀更多 影視天鵝 的文章