部分文字列の包含を決定する効率的な方法は、次のうちどれですか?
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()
の2つのベンチマークメソッドを追加しました(1つは文字列定数を受け取り、もう1つは変数を受け取ります)。 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
1つの文字列に別の文字列が含まれているかどうかを判断することが目標である場合、contains()
が明確な勝者です。他の開発者があなたの意図をより効率的に理解できるようになります。
基本的に両方は同じですが、
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
ただし、インデックスを使用して何かをしたい場合は、indexOf
を使用できます。
indexOf
の方が効率的だと思いますが、違いは無視できます。
文字列に何かが含まれているかどうかを確認する必要がある場合はメソッドを使用しますが、文字列のどこに最終的に含まれるかを知りたい場合は、indexOfメソッドを使用します。
str.contains("/")
を使用するほうが明らかに読みやすくなりますが、str.indexOf('/') > -1
を使用する方が効率的です。 indexOf呼び出しで文字列の代わりに文字を使用していることに注意してください。
ただし、非常にタイトなループに陥っていない限り、これは実際にはパフォーマンスの問題ではありません。
例のような単一文字検索の場合、indexOfの方が効率的ですindexOfの引数がcharの場合:
if (str.indexOf('/') > -1)
最近、indexOf()
を使用してこの問題が発生しました:文字列にスペースが含まれている場合を見つけようとすると、IndexOfからの答えは:文字列スペースがない、これは間違った答えでした。 Contains()
で置き換えられた場合答えは正しいものでした。ここで言っているように、Contains()
はIndexOf
への呼び出しを投稿するので、図に進みます。