Java字符串比较过程
我关心的是java如何比较字符串以及它的优化程度Java字符串比较过程,java,string,performance,if-statement,switch-statement,Java,String,Performance,If Statement,Switch Statement,我关心的是java如何比较字符串以及它的优化程度 让我考虑将用户提供的字符串与我的代码中的10个字符串进行比较。在这10个字符串中,有5个以“A”开头,其他5个以“B”开头 现在,如果我写if..elseif..或switch,那么每个字符串都会被比较,直到它与任何字符串匹配为止,在最坏的情况下,其中任何一个字符串都会在第9个或第10个条件下匹配,或者根本不匹配。因此,平均每个输入执行8到10个条件 现在我的问题是,在检查输入字符串的实际值之前,我们是否可以通过增加一个条件(一种过滤器)来优化这
让我考虑将用户提供的字符串与我的代码中的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已经针对这种情况进行了内部优化 您可以使用映射或集合中的查找,而不是通过每个值进行循环。Java逐字符比较字符串。 在你的“优化”中,你每次都比需要的多比较一个字符。 首先比较第一个字符(A或B),然后比较整个单词,再次包括第一个字符 您的解决方案很好,因为它减少了整词比较的数量。 如果你把单词分成两部分(第一个字母和单词的其余部分),你可以在开头比较第一个字符,就像你正在做的一样。。。然后是另一部分。 问题是你可能会花更多的时间切分单词而不是比较。。。。所以检查一下;) 还有一件事。。。如果使用开关,搜索所花费的时间不取决于元素的数量。。。因此,如果使用开关,则不需要进行第一次优化
你也可以制作一个全局HashMap来查找其中的字符串。。。因此,避免了开关的“映射创建…”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;
}
通常,这种类型的构造是不受欢迎的。主要的问题是,执行流越深入语句,需要评估的条件就越多。当值为9时,完成执行所需的时间将比值为0时长,因为必须事先计算其他每一个条件。随着条件总数的增加,深入条件的性能也会受到影响。虽然有大量的if条件是不可取的,但是您可以采取一些步骤来提高总体性能
第一步是按频率的降序排列条件。由于在第一个条件后退出是最快的操作,因此您希望确保尽可能多地执行该操作。假设上一个示例中最常见的情况是值将等于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 (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;
}
}
}
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;
}
现在,两个最常见的条件出现在if语句的顶部,确保了这些情况下的最佳性能
优化if语句的另一种方法是将条件组织成一系列分支,然后使用二进制搜索算法查找有效条件。在可能出现大量情况的情况下,这是可取的,并且没有一个或两个情况会以足够高的速率发生,以便简单地根据频率进行订购。目标是尽可能多地减少要评估的条件数量。如果示例中的值的所有条件以相同的相对频率出现,则可以按如下方式重写If语句:
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 (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;
}
}
}
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语句:
- 要测试的离散值不超过两个
- 有大量的值可以很容易地划分为多个范围
- 有两个以上但不到10个离散值 测试
- 没有条件的范围,因为这些值是非线性的
- 要测试的值超过10个
- 条件的结果是单个值而不是数字 将要采取的行动