使用Java字符串,“完全期望的文本” .equals(“完全期望的文本”)比“完全期望的文本” .contains(“期望”)快吗?

时间:2019-08-09 18:20:46

标签: java string performance

假设一个字符串包含“ expected”的任何时候,您都知道完整的字符串将始终是“ full期望的文本”,在“ if”条件下执行String.equals(“ full期望的文本”)或String会更快吗? .contains(“ expected”)?

我很好奇,确定从头到尾两个字符串是否相等的算法是否比寻找子字符串的算法更简单,如果是的话,只是进行相等比较是否比查找子字符串更快?只寻找一个子串。我猜是否contains()有时更快,这取决于子字符串的长度,也许取决于整个字符串的长度。

2 个答案:

答案 0 :(得分:5)

首先,请始终根据易于阅读和理解的内容编写代码;微小的计算效率将被开发人员发现任何过于聪明的工作所淹没。

也就是说,在匹配的情况下,要进行比较的图案大小始终至少要为O(m),而且逐个字符的比较尽可能便宜。在失败情况下,这种方法会在发现不匹配时立即退出; 最坏情况为O(m)(唯一需要的状态是单个整数索引)。

另一方面,例如,如果您搜索的字符串为expecteexpecteexpecte,则

Substring algorithms可能不得不重复回溯。这些算法普遍比O(m)(通常至少O(m + n))昂贵。除非您的“完整字符串” 在戏剧上更长,否则我希望简单的equals是更快的选择,并且可以更好地匹配预期的含义。

答案 1 :(得分:1)

是的,相等是一种廉价的操作,易于快速实现,而查找子字符串是一个具有很多权衡因素和通常都很难完全消除的开销的多样化领域。从理论上讲,当输入和输出匹配时,这两种算法在快速路径上的执行效果类似,但是对于相等性而言,还有更多的快速路径,并且在几种常见情况下某些搜索不可避免地会变慢,例如当潜在的子字符串不是居民时更长的字符串。

这与“过早优化”无关,而与使用正确的算法有关。声称如果不进行概要分析就无法对明显的事物进行性能判断的说法相当令人困惑。