2

私の質問は、分割または他の String メソッドが同じ String オブジェクトに対して複数回呼び出される状況に関するものです。

一般的な JVM 実装では、結果をメモリに保存して後で再利用することにより、このような呼び出しを最適化していますか?

それは次のように機能します: 文字列の不変の性質と文字列プールの存在により、式

String resource = "A:B:C";
String[] resourceArr = resource.split(":");

"A:B:C" と ":" を使用するたびに、同じ String オブジェクト参照を使用します。JVM は、これらの参照を使用して格納された結果を照合し、実際の解析を実行せずにそれを提供できます。

4

2 に答える 2

3

を使用しているため、 が最適化されるのと同じ方法substringで最適化されます。splitsubstring

public String substring (int start, int end) {
    if (start == 0 && end == count)
        return this;
    // NOTE last character not copied!
    // Fast range check.
    if (0 <= start && start <= end && end <= count) {
        return new String (offset + start, end - start, value);
    }
    throw new StringIndexOutOfBoundsException();
}

substring同じ文字列のオフセット + 開始と終了 - 開始の間の文字の範囲を返す方法に注意してください。つまり、分割された部分文字列は、元の文字列によって割り当てられた同じメモリへの実質的なポインターです。

于 2012-04-19T14:45:46.900 に答える
2

いいえ。それは非常にメモリを浪費します-同じ分割結果を再利用する必要があることは非常にまれであり、文字列ごとのオーバーヘッドははるかに少なくなります-プログラマーが選択的にそのような結果をいつキャッシュするかを決定します (「通常の方法」)。

于 2012-04-19T14:44:35.543 に答える