-2

Java では、String オブジェクトの場合、null ターミネータはありません。また、Java はオフセットを使用して長さを追跡します。しかし、char配列でも同じですか?

例えば:

char foo[] = new foo[5]; 

char 配列の実際のサイズは? 5ですか?それとも5+1ですか?私が電話したら

System.out.println(foo);

関数は char 配列の最後にいつ到達するかをどのように知るのでしょうか? Java の char 配列に関連付けられた長さフィールドがあることに気付きました。Javaも変数を使用して、nullターミネータを使用する代わりにchar配列の長さを追跡するということですか?

4

2 に答える 2

3

文字の配列は String ではありません。どちらも String a ではありませんchar[]

JLS では、これらは明確に定義された 2 つの別個のエンティティです。文字列は不変です。配列はそうではありません

JLS で定義されているように、実際のサイズchar[]もです。インデックスは常に 0 から始まるため、アクセスできるのはインデックスの場所のみです。50-4

への呼び出しはSystem.out.println(foo) 通常foo.toString()、作業を行うために使用しますがchar[]、 の場合は少し特殊です。PrintStream最終的に、クラスにある次のメソッドに委譲します。

private void write(char buf[]) {
    try {
        synchronized (this) {
            ensureOpen();
            textOut.write(buf);
            textOut.flushBuffer();
            charOut.flushBuffer();
            if (autoFlush) {
                for (int i = 0; i < buf.length; i++)
                    if (buf[i] == '\n')
                        out.flush();
            }
        }
    }
    catch (InterruptedIOException x) {
        Thread.currentThread().interrupt();
    }
    catch (IOException x) {
        trouble = true;
    }
}

したがって、ループによってストリームに出力する必要がある要素の数を正確に認識します。out

最後に (おそらく皮肉なことに)、Stringオブジェクトは内部で を使用してchar[]その値を格納します。配列はその長さを認識しているため、サイズに関する情報を取得するときに配列に委譲します。

private final char value[];

public int length() {
    return value.length;
}
于 2013-11-12T03:04:53.060 に答える
1

と混同sizeしているかもしれませんindexsizeは常に要素数であり、最後のインデックスは要素数 - 1(c.length - 1)です。文字列も同様です。 sizeは文字数、最後の文字は文字数 - 1(s.charAt(s.length() - 1)です。

于 2013-11-12T03:04:54.457 に答える