本文从一个小明写的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<8<2 ,按照这样的规则排序
if (status2 != null && status1 != null) {
// 2-维修中, 维修中排到最后面
if (status2.equals(2)) {
return -1;
} else {
// 8-使用中, 排在倒数第二,仅在维修中之前
if (status2.equals(8) && !status1.equals(2)) {
return -1;
}
}
}
return 0;
}
//Test
public static void main(String[] args) {
List<Integer> 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<Integer> 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 :哪里有问题?不可能有问题!我本地是好的!)
那我们看看情景复现
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)