背景
软件开发中集合排序是比较强大的功能,程序员只要按规范编码,轻松实现排序。
学习目标
- 会利用集合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后变正排序