57

次の方法のうち、部分文字列が含まれているかどうかを判断する効率的な方法はどれですか?

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

また

if (str.contains("/")) 
4

8 に答える 8

112

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

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

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


編集:

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

于 2012-05-23T06:11:47.733 に答える
27

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

于 2016-01-22T21:23:37.607 に答える
3

基本的にどちらも同じですが、

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

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

indexOfより効率的になると思いますが、違いは無視できます。

于 2012-05-23T06:10:16.617 に答える
2

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

于 2012-05-23T06:10:28.300 に答える
1

あなたの例のような単一文字検索の場合、 indexOfへの引数が char の場合、 indexOf はより効率的です:

if (str.indexOf('/') > -1)
于 2015-10-15T15:35:49.090 に答える