以下哪种方法是确定子串包含的有效方法?
if (str.indexOf("/") > -1)
或者
if (str.contains("/"))
看看java.lang.String
源代码。该contains
方法是使用对 的调用来实现的indexOf
,因此它们本质上是相同的。
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
您应该使用使您的代码更具可读性的任何方法。如果要检查字符串是否包含特定子字符串,请使用contains
. 如果您正在寻找子字符串的起始索引,请使用indexOf
.
有几个答案提到indexOf
应该优先考虑,contains
因为它contains
会进行额外的方法调用,因此效率较低。这是错误的。在这种情况下,由额外的方法调用引起的开销完全是微不足道的。使用在您的实施环境中最有意义的任何方法。这将使您的代码更具可读性。
我想我会对这个问题采取经验方法,而不是猜测额外方法调用的开销将如何影响结果。我indexOf
从这个答案中获取了基准,并添加了两种基准方法contains()
(一种采用字符串常量,另一种采用变量)。我正在使用在 Windows x64 上运行的刚刚发布的 1.8.0_71。
# JMH 1.11.3 (released 8 days ago)
# VM version: JDK 1.8.0_71, VM 25.71-b15
Benchmark Mode Cnt Score Error Units
IndexOfTest.containsString avgt 30 26.596 ± 0.099 ns/op
IndexOfTest.containsStringIndirect avgt 30 28.683 ± 0.088 ns/op
IndexOfTest.indexOfChar avgt 30 26.855 ± 0.171 ns/op
IndexOfTest.indexOfCharIndirect avgt 30 25.833 ± 0.116 ns/op
IndexOfTest.indexOfString avgt 30 26.192 ± 0.107 ns/op
IndexOfTest.indexOfStringIndirect avgt 30 27.547 ± 0.152 ns/op
请注意,基准测量是每次操作的纳秒。因此比较 contains("z") 与 indexOf("z"),indexOf() 稍微快一点,但不到 0.6ns。有趣的是,间接(使用变量)的差异较大,略高于 1ns。
我已将此基准测试的代码放在 GitHub 上:https ://github.com/tedyoung/indexof-contains-benchmark
如果目标是确定一个字符串是否包含另一个字符串,那么contains()
显然是赢家。这将使其他开发人员更有效地理解您的意图。
基本上两者是一样的,
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
但是如果你想通过索引做一些事情,你可以使用indexOf
.
我相信indexOf
会更有效率,但差异可以忽略。
这些方法有不同的用途,如果您需要检查 String 是否包含某些内容,则使用 contains,但如果您想知道它最终包含在 String 中的哪个位置,请使用 indexOf 方法。
虽然 usingstr.contains("/")
显然更具可读性,但使用str.indexOf('/') > -1
. 请注意,我在 indexOf 调用中使用字符而不是字符串。
但这在性能方面并不重要,除非您处于非常紧凑的循环中。
最近我遇到了这个问题indexOf()
:当试图找出一个字符串是否包含空格以用其他东西替换它们时,IndexOf 的答案是:字符串没有空格,这是错误的答案。当替换Contains()
为正确的答案时。去算一下,因为正如一些人所说的在这里,Contains()
发布一个电话到IndexOf
.
对于单字符搜索,例如您的示例,如果 indexOf的参数是 char ,则 indexOf 更有效:
if (str.indexOf('/') > -1)