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个条件 现在我的问题是,在检查输入字符串的实际值之前,我们是否可以通过增加一个条件(一种过滤器)来优化这

我关心的是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已经针对这种情况进行了内部优化

您可以使用映射或集合中的查找,而不是通过每个值进行循环。

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语句:

  • 要测试的离散值不超过两个
  • 有大量的值可以很容易地划分为多个范围
•在以下情况下使用switch语句:

  • 有两个以上但不到10个离散值 测试
  • 没有条件的范围,因为这些值是非线性的
•在以下情况下使用数组查找:

  • 要测试的值超过10个
  • 条件的结果是单个值而不是数字 将要采取的行动