2

Java の String オブジェクトのコンストラクタの 1 つを次に示します。

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)が気になるところですが、実行中の IF 内のすべてのコードにこの条件が当てはまるとは思えません。String は、実際には文字の配列です。original.countはその値の長さと等しくなければなりません (その値は文字の配列です)。そのため、条件は発生しません。

私が間違っているかもしれないので、あなたの説明が必要です。ご協力いただきありがとうございます。

ビハロン。

4

2 に答える 2

9

文字列は実際には文字の配列です

いいえ、ちがいます。これは、文字の配列への参照を内部的に持つオブジェクトです。

original.count はその値の長さと等しくなければなりません (その値は文字の配列です)

必ずしも。見ているJavaの正確なバージョンによって異なりますが、最近まで、いくつかの文字列が同じ を参照しchar[]、それぞれが配列の異なる部分を使用していました。

たとえば、次の場合:

String longString = "this is a long string";
String shortString = longString.substring(0, 2);

... 参照されるオブジェクトは、参照される元の文字列とshortString同じchar[]ものを使用しますが、開始オフセットは 0 でカウントは 2 です。

String copyOfShortString = new String(shortString);

それは確かにifあなたがあなたの質問で心配していたブロックに入ります.

Java 7 update 5 の時点で、Oracle JRE はsubstring常にコピーを取るように変更されました。(この背後にある長所と短所は非常に複雑になる可能性がありますが、両方のシステムに注意する価値があります。)

あなたが見ているコードのバージョンは古いバージョンのようです。文字列オブジェクトは基になる配列を共有できますが、異なる部分を表示できます。

于 2013-03-30T09:12:49.737 に答える
3

あなたが見ているString実装は、部分文字列を作成するときに文字データをコピーしません。代わりに、複数のStringオブジェクトが同じ文字配列を参照できますが、offsetandは異なりcountます (したがってlength)。

したがって、if条件は実際には真である可能性があります。

この文字配列の共有は、最近のバージョンの Oracle JDK では削除されていることに注意してください。

于 2013-03-30T09:12:45.247 に答える