以下哪种方法是确定子字符串包含的有效方法?
if (str.indexOf("/") > -1)
或
if (str.contains("/"))
答案 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)