5

StringIndexOutOfBoundsExceptionforを取得しましたsetCharAt(int index, char ch)

StringBuilder word = new StringBuilder(4);

for(int i = 0; i < 4; i++)
    word.setCharAt(i,'-');

StringBuilder(int capacity):文字が含まれておらず、容量引数で指定された初期容量を持つ文字列ビルダーを構築します。

setCharAt(int index, char ch):指定されたインデックスの文字が ch に設定されます。

私が考えることができる唯一のことは、メモリが割り当てられていないということですが、それでは何のポイントStringBuilder(int capacity)ですか?

4

3 に答える 3

6

使うだけStringBuilder.append()

使用しているコンストラクターは、StringBuilder にデータを配置するために何もしません。

StringBuilder の実用的なサイズのみを指定します (これパフォーマンスのためだと思います)。

実際に StringBuilder に何かを入れるまで、コードは例外をスローします。

引用したドキュメントには、これが明示的に記載されていることに注意してください。

" CHARACTERSを含まない文字列ビルダーを構築し ます... "

于 2013-06-08T00:53:22.453 に答える
5

私が考えることができる唯一のことは、メモリが割り当てられていないということですが、それでは StringBuilder(int capacity) のポイントは何ですか?

ポイントは、挿入されるすべてのデータを処理するのに十分な大きさのメモリ チャンクを割り当てる前もっての機会を提供することです。容量を超えると、内部的に新しいメモリ チャンクを割り当て、古いメモリのすべての値をコピーする必要があります。ご想像のとおり、これが何度も発生すると、パフォーマンスに負担がかかる可能性があります。

この動作は実際には奇妙でも予想外でもありません。実際、カプセル化の実践と完全に一致しています。

どうするArrayList?AnArrayListは配列によって支えられており、十分な初期容量を使用するとパフォーマンスが向上しますが、それでも配列のインデックスへの任意のアクセスは許可されません。

StringBuilder奇妙な振る舞いは、 aを a の表現と考えていると思いますchar[]。表現はそのままで適切にカプセル化されています。奇妙な方法で突っ込まないでください。

于 2013-06-08T01:02:57.347 に答える
4

これは、 では少し奇妙な動作のように思えStringBuilderます。

AbstractStringBuilder継承する)では、コンストラクターは次のように定義されます。

AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}

ただし、 を使用する場合は、代わりに以下setCharAt()をチェックします。count

public void setCharAt(int index, char ch) {
    if ((index < 0) || (index >= count))
        throw new StringIndexOutOfBoundsException(index);
    value[index] = ch;
}

countしたがって、初期コンストラクターを使用して設定しなかったため、顔にエラーがスローされます。

countappend()replace()insert()、およびで再定義されsetLength()ます。;も呼び出すことで問題を解決setLength(4)できます。ただし、@jahroy が指摘したように、単に使用する方が簡単append()です。

関連するソースコード: StringBuilder,AbstractStringBuilder

于 2013-06-08T00:57:20.720 に答える