我担心Java如何比较String以及它是如何优化的。
考虑一下,我需要将用户提供的字符串与我的代码中的10个字符串进行比较。在这10个字符串中,5个以'A'开头,其他5个以'B'开头。
现在,如果我写if..elseif..
或switch
,则将比较每个字符串,直到它与任何String匹配为止,在最坏的情况下,要么String在第9个或第10个条件下匹配,要么根本不匹配。因此,平均每个输入要执行8到10个条件。
现在我的问题是,在检查输入字符串与实际值之前,是否可以通过再放置一个条件(过滤器种类)来优化这种情况?像下面一样
if(inputString.charAt(0) == 'A'){
if(){
....
}else if(){
....
}
}else if(inputString.charAt(0) == 'B'){
if(){
...
}else if(){
...
}
}
它可以提高系统性能还是Java已经针对这种情况进行了内部优化。
最佳答案
if语句
讨论通常围绕以下复杂的if语句开始:
if (value == 0){
return result0;
} else if (value == 1){
return result1;
} else if (value == 2){
return result2;
} else if (value == 3){
return result3;
} else if (value == 4){
return result4;
} else if (value == 5){
return result5;
} else if (value == 6){
return result6;
} else if (value == 7){
return result7;
} else if (value == 8){
return result8;
} else if (value == 9){
return result9;
} else {
return result10;
}
通常,这种类型的构造是不满意的。主要的问题是执行深入到语句中时,必须评估更多条件。当value为9时,完成执行要比value为0时花费更长的时间,因为必须事先评估所有其他条件。随着条件总数的增加,深入了解条件的性能也会受到影响。尽管不建议使用很多情况,但您可以采取一些步骤来提高整体效果。
第一步是按频率递减的顺序排列条件。由于在第一种情况后退出是最快的操作,因此您要确保这种情况尽可能频繁地发生。假设在前面的示例中,最常见的情况是值等于5,第二最常见的情况是值等于9。在这种情况下,您知道先评估五个条件,然后再评估九个条件。第二种最常见的情况;这是非常低效的。即使条件的数字顺序增加,也更易于阅读,但实际上应按以下方式重写:
if (value == 5){
return result5;
} else if (value == 9){
return result9;
} else if (value == 0){
return result0;
} else if (value == 1){
return result1;
} else if (value == 2){
return result2;
} else if (value == 3){
return result3;
} else if (value == 4){
return result4;
} else if (value == 6){
return result6;
} else if (value == 7){
return result7;
} else if (value == 8){
return result8;
} else {
return result10;
}
现在,两个最常见的条件出现在if语句的顶部,从而确保了针对这些情况的最佳性能。
优化语句的另一种方法是按照二进制搜索算法找到有效条件,将条件组织为一系列分支。在可能存在大量条件且不会以足够高的速率简单地根据频率进行排序的一个或两个条件发生的情况下,建议这样做。目标是尽可能减少要评估的条件数量。如果示例中所有值条件都以相同的相对频率出现,则if语句可以重写如下:
if (value < 6){
if (value < 3){
if (value == 0){
return result0;
} else if (value == 1){
return result1;
} else {
return result2;
}
} else {
if (value == 3){
return result3;
} else if (value == 4){
return result4;
} else {
return result5;
}
}
} else {
if (value < 8){
if (value == 6){
return result6;
} else {
return result7;
}
} else {
if (value == 8){
return result8;
} else if (value == 9){
return result9;
} else {
return result10;
}
}
}
该代码确保评估的条件绝不会超过四个。在评估实际值之前,先将条件分为一系列范围,而不是评估每个条件以找到正确的值。此示例的整体性能得到了改善,因为已删除了需要评估八个和九个条件的情况。现在,条件评估的最大数量为四个,与以前版本的执行时间相比,平均节省了大约30%。同样要记住,else语句没有条件可以求值。但是,问题仍然在于,每个附加条件最终都需要花费更多的时间来执行,不仅影响该代码的性能,而且影响其可维护性。这是switch语句出现的地方。
切换语句
switch语句简化了多种条件的外观和性能。您可以使用switch语句重写以下示例,如下所示:
switch(value){
case 0:
return result0;
case 1:
return result1;
case 2:
return result2;
case 3:
return result3;
case 4:
return result4;
case 5:
return result5;
case 6:
return result6;
case 7:
return result7;
case 8:
return result8;
case 9:
return result9;
default:
return result10;
}
该代码以更易读的形式清楚地指示了条件以及返回值。 switch语句还具有允许直通条件的优点,该条件允许您为多个不同的值指定相同的结果,而无需创建复杂的嵌套条件。在其他编程语言中,switch语句经常被用作评估多种条件的最佳选择。这不是由于switch语句的性质,而是由于编译器如何优化switch语句以加快评估速度。
另一个选择:数组查找
有两种以上的JavaScript处理条件解决方案。除了if语句和switch语句外,还有第三种方法:在数组中查找值
for(String s: arr){
if(s.equals(targetValue))
return true;
}
return false;
尽管数组查找时间也增加了您进入数组的深度,但增量的增加是如此之小,以至于与if和switch语句的每个条件评估中的增加无关。这使数组查找在需要满足大量条件的情况下都是理想的,并且条件可以用离散值(例如数字或字符串)表示
最快的条件
此处介绍的三种技术(if语句,switch语句和数组查找)在优化代码执行中都有各自的用途:
•在以下情况下使用if语句:
要测试的离散值不超过两个。
有大量的值可以轻松地分为多个范围。
•在以下情况下使用switch语句:
有两个以上但少于10个离散值
去测试。
条件值没有范围,因为值是非线性的。
•在以下情况下使用数组查找:
有超过10个要测试的值。
条件的结果是单个值而不是数字
采取的行动。
关于java - Java String比较过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30165048/