您的位置 首页 java

java1.8各种集合类型的排序,100万性能压力测试

背景

软件开发中集合排序是比较强大的功能,程序员只要按规范编码,轻松实现排序。

学习目标

  • 会利用集合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到新知识的,请关注啊

文章来源:智云一二三科技

文章标题:java1.8各种集合类型的排序,100万性能压力测试

文章地址:https://www.zhihuclub.com/183237.shtml

关于作者: 智云科技

热门文章

网站地图