web-dev-qa-db-ja.com

どの文字列メソッド:「含む」または「indexOf> -1」?

部分文字列の包含を決定する効率的な方法は、次のうちどれですか?

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

または

if (str.contains("/")) 
43
sashank

Java.lang.String ソースコード。 containsメソッドはindexOfの呼び出しを使用して実装されるため、本質的に同じです。

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

コードを読みやすくする方法を使用する必要があります。文字列に特定の部分文字列が含まれているかどうかを確認する場合は、containsを使用します。部分文字列の開始インデックスを探している場合は、indexOfを使用します。


編集:

indexOfは追加のメソッド呼び出しを行うため、containscontainsよりも優先されるべきであるため、効率が悪いという回答がいくつかあります。 これは間違っています。この場合、追加のメソッド呼び出しによって引き起こされるオーバーヘッドはまったく重要ではありません。実装のコンテキストで最も意味のある方法を使用してください。これにより、コードが読みやすくなります。

90
Alex Lockwood

追加のメソッド呼び出しのオーバーヘッドが結果にどのように影響するかを推測するのではなく、この質問に対して経験的なアプローチを取ると思いました。 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

21
Ted M. Young

1つの文字列に別の文字列が含まれているかどうかを判断することが目標である場合、contains()が明確な勝者です。他の開発者があなたの意図をより効率的に理解できるようになります。

4

基本的に両方は同じですが、

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

ただし、インデックスを使用して何かをしたい場合は、indexOfを使用できます。

indexOfの方が効率的だと思いますが、違いは無視できます。

3
Pau Kiat Wee

文字列に何かが含まれているかどうかを確認する必要がある場合はメソッドを使用しますが、文字列のどこに最終的に含まれるかを知りたい場合は、indexOfメソッドを使用します。

2
aleroot

str.contains("/")を使用するほうが明らかに読みやすくなりますが、str.indexOf('/') > -1を使用する方が効率的です。 indexOf呼び出しで文字列の代わりに文字を使用していることに注意してください。

ただし、非常にタイトなループに陥っていない限り、これは実際にはパフォーマンスの問題ではありません。

2

例のような単一文字検索の場合、indexOfの方が効率的ですindexOfの引数がcharの場合

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

最近、indexOf()を使用してこの問題が発生しました:文字列にスペースが含まれている場合を見つけようとすると、IndexOfからの答えは:文字列スペースがない、これは間違った答えでした。 Contains()で置き換えられた場合答えは正しいものでした。ここで言っているように、Contains()IndexOfへの呼び出しを投稿するので、図に進みます。

1
agcala