1

たとえば、次のコードがあるとします。

String s1 = "foobar";
s1 = s1.substring(3);

そのコードは次のコードよりも効率が悪いでしょうか。

String s1 = "foobar";
s1 = s1.substring(3, 6);

単一パラメーターの方法は、長さに達するまでループを使用してインデックスをループするため、2 つのパラメーターの方法はより効率的なパフォーマンスになると考えていました。これは、JVM がlength()メソッドを呼び出して、ループを停止するタイミングを見つける必要があることを意味します。

ただし、2 つのパラメーターを使用する方法は、最後のインデックス番号に到達するまでループするだけです。

私の仮説を肯定または否定できる人はいますか?

編集: ソース (最後の return ステートメント) のこのコードはよくわかりませんが、Java String クラスのソースは次のとおりです。

public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
     }
     if (endIndex > count) {
        throw new StringIndexOutOfBoundsException(endIndex);
     }
    if (beginIndex > endIndex) {
    }
    return ((beginIndex == 0) && (endIndex == count)) ? this :    // I don't understand this part
         new String(offset + beginIndex, endIndex - beginIndex, value);
}
4

4 に答える 4

10

String.substring()は定数時間1であり、元の文字列を小さく表示するだけです。さらに、パラメーターが 1 つのバージョンは、2 つあるバージョンに委譲されます。

public String substring(int beginIndex) {
    return substring(beginIndex, count);
}

countによって返される値はどこにありますかString.length()。どちらのバージョンを選択しても問題ありません。どちらも非常に高速です。

1 - Java 7 update 6 の時点では明らかに当てはまりません。しかし、それはあなたの質問とは無関係です。

于 2012-11-30T20:50:41.410 に答える
1

違いはないと思います。String クラスのソース コード substring(int beginIndex) が表示されている場合は、単に substring(beginIndex, lengthOfTheString) を呼び出します。

于 2012-11-30T20:52:25.130 に答える
1
 public String substring(int beginIndex, int endIndex) 

少し速いので

 public String substring(int beginIndex) {
      return substring(beginIndex, count);
 }

したがって、1 つの間接化を避けることができます。しかし、それについて考える価値はありません。

于 2012-11-30T20:52:29.730 に答える
0

Java ソース コードでsubstring(beginIndex)は、呼び出しますsubstring(beginIndex, count)

于 2012-11-30T20:52:31.343 に答える