57

以下哪种方法是确定子串包含的有效方法?

if (str.indexOf("/") > -1)

或者

if (str.contains("/")) 
4

8 回答 8

112

看看java.lang.String源代码。该contains方法是使用对 的调用来实现的indexOf,因此它们本质上是相同的。

public boolean contains(CharSequence s) {
    return indexOf(s.toString()) > -1;
}

您应该使用使您的代码更具可读性的任何方法。如果要检查字符串是否包含特定子字符串,请使用contains. 如果您正在寻找子字符串的起始索引,请使用indexOf.


编辑:

有几个答案提到indexOf应该优先考虑,contains因为它contains会进行额外的方法调用,因此效率较低。这是错误的。在这种情况下,由额外的方法调用引起的开销完全是微不足道的。使用在您的实施环境中最有意义的任何方法。这将使您的代码更具可读性。

于 2012-05-23T06:11:47.733 回答
27

我想我会对这个问题采取经验方法,而不是猜测额外方法调用的开销将如何影响结果。我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

于 2016-01-22T21:23:37.607 回答
5

如果目标是确定一个字符串是否包含另一个字符串,那么contains()显然是赢家。这将使其他开发人员更有效地理解您的意图。

于 2012-05-23T06:17:30.793 回答
3

基本上两者是一样的,

public boolean contains(CharSequence s) {
    return indexOf(s.toString()) > -1;
}

但是如果你想通过索引做一些事情,你可以使用indexOf.

我相信indexOf会更有效率,但差异可以忽略。

于 2012-05-23T06:10:16.617 回答
2

这些方法有不同的用途,如果您需要检查 String 是否包含某些内容,则使用 contains,但如果您想知道它最终包含在 String 中的哪个位置,请使用 indexOf 方法。

于 2012-05-23T06:10:28.300 回答
2

虽然 usingstr.contains("/")显然更具可读性,但使用str.indexOf('/') > -1. 请注意,我在 indexOf 调用中使用字符而不是字符串。

但这在性能方面并不重要,除非您处于非常紧凑的循环中。

于 2013-07-18T10:17:50.357 回答
1

最近我遇到了这个问题indexOf():当试图找出一个字符串是否包含空格以用其他东西替换它们时,IndexOf 的答案是:字符串没有空格,这是错误的答案。当替换Contains() 为正确的答案时。去算一下,因为正如一些人所说的在这里,Contains()发布一个电话到IndexOf.

于 2014-07-04T15:51:30.360 回答
1

对于单字符搜索,例如您的示例,如果 indexOf的参数是 char ,则 indexOf 更有效:

if (str.indexOf('/') > -1)
于 2015-10-15T15:35:49.090 回答