在这篇文章中,我们将讨论另一种流行的代码结构String.replaceAll和String.replace方法的使用,我们将研究它如何影响 Java 11 中代码的性能以及您可以做些什么。
(请从性能的角度考虑以下所有代码)
(请不要关注数字,它们只是证明这一点的指标)
String.replaceAll
我不会说我喜欢编造示例,所以这次,我们将从 Spring 框架的现有代码库开始。我们看一下spring-messaging模块的MetadataEncoder类的这一行:
value.contains(".") ?value.replaceAll("\\.","%2E") :值;
你知道这里有什么问题吗?
这段代码试图做的就是对点符号进行编码,然后将结果传递给 HTTP URL。我很幸运能在流行的代码库中找到那个特定的代码片段。它在一行中有几件事。
如果您是一位经验丰富的开发人员,您已经知道String.replaceAll 方法使用正则表达式模式作为第一个参数:
公共字符串替换所有(字符串正则表达式,字符串替换){
返回模式。<em>编译</em>(正则表达式).matcher(this)
.replaceAll(replacement);
}
但是,在上面的代码中,我们只替换了点字符。很多时候,当您执行替换操作时,您不需要任何模式匹配。就性能而言,您可以使用另一种非常相似且更轻的方法 - String.replace:
公共字符串替换(CharSequence 目标,CharSequence 替换)
例如,当您需要像我们的示例中那样替换单个单词或单个字符时。
注意:在 Java 8 中,String.replace方法 使用里面的Pattern作为String.replaceAll。但是,自 Java 9 以来,它发生了变化。这为我们在现有代码库中提供了很大的优化空间。
此外,String.replace和String.replaceAll方法的使用在设计上似乎很容易出错。这是因为当您开始在 IDE 中输入内容并仔细查看这两种方法时,您可能会认为String.replace仅替换第一个匹配项,而replaceAll替换所有匹配项。直观地,您将选择String.replaceAll而不是String.replace。
另一个有趣的地方是上面的代码已经有了一个微优化,就是value.contains(“.”)方法的使用。因此,如果没有可替换的内容,则会检查字符串中的点符号以避免模式匹配。
好的,让我们修复上面的示例:
value.replace(".", "%2E");
我们还可以尝试应用String.indexOf(“.”)优化并检查这是否有助于Java 11 中使用String.replace方法:
value.contains(".") ?value.replace(".", "%2E") : 值;