哪个String方法:“contains”或“indexOf> -1”?

时间:2012-05-23 06:08:50

标签: java string substring

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

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

if (str.contains("/")) 

8 个答案:

答案 0 :(得分:85)

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

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

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


编辑:

有几个答案提到indexOf应优先于contains,因为contains进行了额外的方法调用,因此效率较低。 这是错误的。在这种情况下由额外的方法调用引起的开销是完全无关紧要的。使用在您的实现环境中最有意义的方法。这将使您的代码更具可读性。

答案 1 :(得分:20)

我认为我会对这个问题采取经验方法,而不是猜测额外方法调用的开销会如何影响结果。我从this answer获取indexOf基准,并为contains()添加了两个基准方法(一个采用字符串常量,另一个采用变量)。我正在使用刚刚发布的1.8.0_71在Windows x64上运行。

# 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

请注意,每次操作的基准测量值为纳秒。因此,比较包含(“z”)与indexOf(“z”),indexOf()非常快,但小于0.6ns。有趣的是,间接(使用变量)的差异略大于1ns。

我已将此基准的代码放在GitHub上:https://github.com/tedyoung/indexof-contains-benchmark

答案 2 :(得分:4)

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

答案 3 :(得分:3)

基本上两者都是一样的,

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

但如果您想通过索引执行某些操作,则可以使用indexOf

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

答案 4 :(得分:2)

这些方法有不同的用途,如果你需要检查String是否包含某些内容然后使用contains,但是如果你想知道String最终包含在哪里,请使用indexOf方法。

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

最近我使用indexOf()遇到了这个问题:当试图找出如果一个String包含空格用其他东西替换它们时,IndexOf的答案是:字符串没有空格,这是错误的答案。替换为Contains() 时,答案是正确的。举个例子,因为正如一些人在这里所说,Contains()发布了对IndexOf的调用。

答案 7 :(得分:1)

对于单个字符搜索(如您的示例),如果indexOf的参数为char ,则indexOf效率更高

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