本文从一个小明写的bug 开始,讲bug的发现、排查定位,并由此展开对涉及的算法进行图解分析和源码分析。
事情挺曲折的,因为小明的代码是有单测的,让小明更加笃定自己写的没问题。所以在排查的时候,也经历了前世的500年,去排查排序后的list改动(主要是小明和同事互相怀疑对方的代码,不多说了)。
本文从问题定位之后开始讲:
前言
小明写了一个自定义排序的代码,简化后如下。聪明的你快来帮小明review一下吧。
代码
背景:有一批休息室,status是状态,其中1表示空闲,8表示使用中,2表示在维修。需要按照1空闲8使用中2在维修的顺序进行排序。
例如:输入:[1,8, 2, 2, 8, 1, 8],期望输出:[1, 1, 8, 8, 8, 2, 2]。list不为空,数量小于100。
环境:JDK 8
小明的代码如下:
/**
* 排序
*/
private static int compare(Integer status1, Integer status2) {
// 1 list = Lists.newArrayList(1, 8, 2, 2, 8, 1, 8);
System.out.println("排序前:"+list);
list.sort(Test::compare);
System.out.println("排序后:"+list);
}
看上面的代码有问题么?别急,咱们先给个入参试一下。
测试
[ 1, 8, 2, 2, 8, 1, 8 ]
public static void main(String[] args) {
List list = Lists.newArrayList(1, 8, 2, 2, 8, 1, 8);
System.out.println("排序前:"+list);
list.sort(Test::compare);
System.out.println("排序后:"+list);
}
输出:
排序前:[1, 8, 2, 2, 8, 1, 8]
排序后:[1, 1, 8, 8, 8, 2, 2]
结论:结果是对的,符合预期 。 ( 按照1空闲8使用中2维修中的顺序进行排序) 。
嗯,看起来排序是对的。但确实是有问题呢?
(小明OS :哪里有问题?不可能有问题!我本地是好的!)
那我们看看情景复现