我关心的是,java如何比较字符串,以及它是如何优化的。
让我们考虑一下,我需要将用户提供的字符串与代码中的10个字符串进行比较。在这10个字符串中,5个是以“A”开头的,另外5个是以“B”开头的。
现在,如果我编写if..elseif..或switch,那么将比较每个字符串,直到它与任何字符串匹配,在最坏的情况下,其中一个字符串在第9或第10个条件下匹配,或者根本不匹配。因此,每个输入平均执行8到10个条件。
现在我的问题是,在检查输入字符串与实际值之前,我们是否可以通过多放一个条件(一种过滤器)来优化这种情况。如下所示,
if(inputString.charAt(0) == 'A'){
if(){
....
}else if(){
....
}
}else if(inputString.charAt(0) == 'B'){
if(){
...
}else if(){
...
}
}它能提高系统的性能吗?或者Java已经针对这种情况进行了内部优化。
发布于 2015-05-11 18:33:55
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时更长,因为其他所有条件都必须事先进行评估。随着条件总数的增加,深入条件的性能也会受到影响。虽然使用大量的if条件是不可取的,但是您可以采取一些步骤来提高整体性能。
第一步是按照频率的降序排列条件。由于在第一个条件之后退出是最快的操作,因此您需要确保这种情况尽可能频繁地发生。假设上一个示例中最常见的情况是值等于5,第二个最常见的情况是值等于9。在这种情况下,您知道在进入最常见的情况之前将评估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语句:
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语句:
·在以下情况下使用数组查找:
发布于 2015-05-11 18:26:23
您可以使用Map或Set中的查找,而不是循环遍历每个值。
发布于 2015-05-11 18:26:58
Java逐个字符比较字符串。使用您的“优化”,您每次都会比较比所需的字符多一个字符。您开始比较第一个字符(A或B),然后比较整个单词,再次包括第一个字符。
你的解决方案很好,因为减少了整个单词的比较次数。如果你把单词切成两部分(第一个字母和单词的其余部分),你可以在开始时比较第一个字符,就像你正在做的那样……然后是另一部分。问题是你可能会花更多的时间来切分单词,而不是比较……因此,请检查它;)
还有一件事。如果使用开关,则搜索所用的时间不取决于元素的数量...因此,如果使用开关,则不需要进行第一个优化。
你也可以创建一个全局HashMap来查找其中的字符串...这样就避免了交换机的“地图创建”...
https://stackoverflow.com/questions/30165048
复制相似问题