6

以下はStringクラス のコンストラクタです

public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
    // The array representing the String is bigger than the new
    // String itself.  Perhaps this constructor is being called
    // in order to trim the baggage, so make a copy of the array.
        int off = original.offset;
        v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
    // The array representing the String is the same
    // size as the String, so no point in making a copy.
    v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}

しかし、どうすればいいのだろうか

if (originalValue.length > size)

起こる?コメントには「手荷物をトリミングする」と書かれていますが、手荷物とは何を指しますか?

4

1 に答える 1

4

サブストリングを見ると、これがどのように発生するかがわかります。

たとえばString s1 = "Abcd"; String s2 = s1.substring(3)s1.size()これは1ですが、 4です。これは、 s1.values1.value.lengthがs2.valueと同じであるためです。これはパフォーマンス上の理由で行われます(元の文字列の内容をコピーする必要がないため、サブ文字列はO(1)で実行されています)。

サブストリングを使用すると、メモリリークが発生する可能性があります。非常に長い文字列があり、その一部だけを保持したいとします。サブストリングのみを使用する場合、実際には元のストリングの内容をメモリーに保持します。String snippet = new String(reallyLongString.substring(x,y))を実行すると、不要になった大きなchar配列をバックアップするメモリを浪費するのを防ぐことができます。

Javaの「newString(...)」という式の目的は何ですか?も参照してください。詳細については。

于 2012-10-16T05:22:25.473 に答える