首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java字符串比较过程

Java字符串比较过程
EN

Stack Overflow用户
提问于 2015-05-11 18:15:27
回答 3查看 102关注 0票数 1

我关心的是,java如何比较字符串,以及它是如何优化的。

让我们考虑一下,我需要将用户提供的字符串与代码中的10个字符串进行比较。在这10个字符串中,5个是以“A”开头的,另外5个是以“B”开头的。

现在,如果我编写if..elseif..switch,那么将比较每个字符串,直到它与任何字符串匹配,在最坏的情况下,其中一个字符串在第9或第10个条件下匹配,或者根本不匹配。因此,每个输入平均执行8到10个条件。

现在我的问题是,在检查输入字符串与实际值之前,我们是否可以通过多放一个条件(一种过滤器)来优化这种情况。如下所示,

代码语言:javascript
复制
   if(inputString.charAt(0) == 'A'){
            if(){
                ....
            }else if(){
                ....
            }
        }else if(inputString.charAt(0) == 'B'){
            if(){
                ...
            }else if(){
                ...
            }
        }

它能提高系统的性能吗?或者Java已经针对这种情况进行了内部优化。

EN

回答 3

Stack Overflow用户

发布于 2015-05-11 18:33:55

if语句

讨论通常从复杂的if语句开始,如下所示:

代码语言:javascript
复制
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个条件;这是非常低效的。尽管条件的递增数字顺序使其更易于阅读,但实际上应该将其重写为:

代码语言:javascript
复制
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语句:

代码语言:javascript
复制
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语句重写前面的示例,如下所示:

代码语言:javascript
复制
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语句之外,还有第三种方法:在数组中查找值

代码语言:javascript
复制
for(String s: arr){
    if(s.equals(targetValue))
        return true;
}
return false;

尽管数组查找时间也会随着您深入数组的深入而增加,但增量增加非常小,与if和switch语句的每个条件计算的增加无关。这使得数组查找在需要满足大量条件时非常理想,并且这些条件可以由离散值表示,例如数字或字符串

最快的条件句

这里介绍的三种技术- if语句、switch语句和数组查找-在优化代码执行方面各有用处:

·在以下情况下使用if语句:

  • 要测试的离散值不超过两个。
  • 有大量的值可以很容易地分成不同的范围。

·在以下情况下使用switch语句:

  • 有两个以上但少于10个要测试的离散值。
  • 没有条件的范围,因为这些值是非线性的。

·在以下情况下使用数组查找:

  • 要测试的值超过10个。
  • 条件的结果是单个值,而不是要执行的多个操作。
票数 1
EN

Stack Overflow用户

发布于 2015-05-11 18:26:23

您可以使用Map或Set中的查找,而不是循环遍历每个值。

票数 0
EN

Stack Overflow用户

发布于 2015-05-11 18:26:58

Java逐个字符比较字符串。使用您的“优化”,您每次都会比较比所需的字符多一个字符。您开始比较第一个字符(A或B),然后比较整个单词,再次包括第一个字符。

你的解决方案很好,因为减少了整个单词的比较次数。如果你把单词切成两部分(第一个字母和单词的其余部分),你可以在开始时比较第一个字符,就像你正在做的那样……然后是另一部分。问题是你可能会花更多的时间来切分单词,而不是比较……因此,请检查它;)

还有一件事。如果使用开关,则搜索所用的时间不取决于元素的数量...因此,如果使用开关,则不需要进行第一个优化。

你也可以创建一个全局HashMap来查找其中的字符串...这样就避免了交换机的“地图创建”...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30165048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档