到年底了,公司开始对项目质量重视起来,有个接口耗时竟然超过了30秒,接口实现的逻辑不是很复杂,说明代码逻辑存在很大的问题。
先简单的说明下这个问题吧,有一定数量的不相同字符串(纯英文字母和数字组合),需要找出忽略大小写相同的字符串,比如demo和Demo,DEMO是忽略大小写相等的。
这个问题咋一看挺简单的,遍历每个字符串比较一下不就可以吗?于是很快得到下面代码(Java语言)。
List<String> list = new ArrayList<>(1000);
// 这里省略了字符串的获取方式...
for (String string : list) {
for (String otherString : list) {
if (string.equals(otherString)) {
// 如果是自身字符串跳过
continue;
}
if (string.equalsIgnoreCase(otherString)) {
System.out.println(string + " is equalsIgnoreCase with " + otherString);
}
}
}
代码逻辑实现比较简单,遍历字符串两两进行比较,如果忽略大小写相等则输出结果。问题就出在这里,该方法的复杂度是n的平方,如果字符串的数量是100,比较次数是一万次(忽略自身比较跳过次数)。如果字符串的数量是1000,比较次数是一百万次(忽略自身比较跳过次数),这个