次の方法のうち、部分文字列が含まれているかどうかを判断する効率的な方法はどれですか?
if (str.indexOf("/") > -1)
また
if (str.contains("/"))
java.lang.String
ソースコードを見てみましょう。メソッドは へのcontains
呼び出しを使用して実装されるindexOf
ため、本質的に同じです。
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
コードをより読みやすくする方法を使用する必要があります。String に特定の部分文字列が含まれているかどうかを確認する場合は、 を使用しますcontains
。部分文字列の開始インデックスを探している場合は、を使用しますindexOf
。
いくつかの回答では、追加のメソッド呼び出しを行うため、効率が低下するため、indexOf
優先する必要があることに言及しています。これは間違っています。この場合、追加のメソッド呼び出しによって発生するオーバーヘッドはまったく重要ではありません。実装のコンテキストで最も意味のある方法を使用してください。これにより、コードが読みやすくなります。contains
contains
追加のメソッド呼び出しのオーバーヘッドが結果にどのように影響するかを推測するのではなく、この質問に対して経験的なアプローチを取ると思いました。この回答indexOf
からベンチマークを取得し、2 つのベンチマーク メソッドを追加しました(1 つは文字列定数を使用し、もう 1 つは変数を使用します)。Windows x64 で動作するリリースされたばかりの 1.8.0_71 を使用しています。contains()
# 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
基本的にどちらも同じですが、
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
しかし、インデックスを介して何かをしたい場合は、を使用できますindexOf
。
indexOf
より効率的になると思いますが、違いは無視できます。
String に何かが含まれているかどうかを確認する必要がある場合は、contains を使用しますが、最終的に String のどこに含まれているかを知りたい場合は、indexOf メソッドを使用します。
あなたの例のような単一文字検索の場合、 indexOfへの引数が char の場合、 indexOf はより効率的です:
if (str.indexOf('/') > -1)