-1

char[] valueJava の String クラスに,int offsetおよびint countフィールドがあるのはなぜですか。彼らの目的は何ですか?

4

2 に答える 2

3

配列は、その文字列を構成する文字のchar[]配列を保持します。

演算にはオフセットとカウントが使用されString.substring()ます。文字列の部分文字列を取得すると、結果Stringは元の文字配列を参照しますが、関連するオフセットと長さが格納されます (これはflyweight パターンと呼ばれ、メモリを節約するために一般的に使用される手法です)。

例えばString.substring("ABCDEF", 1, 2);

の元の配列を参照しますが、 1 と 1 にA,B,C,D,E,F設定します(メソッドが開始インデックスと終了インデックスを使用するため)。文字配列はimmutableであるため、これは簡単に実行できることに注意してください。変更することはできません。offsetlengthsubstring

注: これは最近変更され (7u6 だと思います)、最近のバージョンでは当てはまりません。これは、この最適化が実際にはあまり使用されていないことに気付いたためだと思います。

于 2013-03-12T18:05:17.487 に答える
0

それらは、主に配列の一部に関心のあるルーチンのバッキングとして、配列を前後に渡すことを可能にします。これにより、大量の小さな配列を構築することを心配する必要がなくなり、特定の操作のオブジェクト構築に関連するコストを回避できます。

たとえば、配列を入力バッファーとして使用する場合がありますが、そのバッファー内のチャンクアップされた文字を処理するために追加の配列が必要になる場合があります。配列、オフセット、およびカウントの 3 つの引数を使用すると、中間からの読み取りを「シミュレート」できます。新しい (セカンダリ) 配列を作成する必要なしにバッファを作成します。

これは重要です。配列 (Java のオブジェクト) に入力文字を保持することは合理的であるかもしれませんが、データを渡すために数千の配列を割り当ててガベージ コレクション (およびそれらに文字をコピー) することはおそらく望まないからです。空白で区切られた単一の単語のみを期待するものに変換します(これは単なる例です)。

于 2013-03-12T18:06:13.763 に答える