-2

在 Java 中,对于 String 对象,没有空终止符。Java 使用偏移量来跟踪长度。但是,char 数组的情况是否相同?

例如:

char foo[] = new foo[5]; 

char 数组的实际大小是多少?是5吗?还是5+1?如果我打电话

System.out.println(foo);

函数如何知道何时到达 char 数组的末尾?我注意到 Java 中有一个与 char 数组关联的长度字段。这是否意味着Java还使用变量来跟踪char数组的长度而不是使用空终止符?

4

2 回答 2

3

字符数组不是字符串。字符串 a 也不是char[]

在 JLS 看来,它们是两个独立的、定义明确的实体。字符串是不可变的;数组不是.

您的实际大小char[]也是由 JLS 定义5的。由于索引始终从零开始,因此您只能访问索引位置。0-4

调用System.out.println(foo) 通常用于foo.toString()完成工作,但对于 achar[]来说,它有点特别。它最终委托给类中的这个方法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[]在幕后使用 a 来存储它的值。由于数组知道它的长度,它在提取有关其大小的信息时委托给它:

private final char value[];

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

也许你sizeindex. size总是多少元素,最后一个索引是多少元素 - 1 (c.length - 1)。字符串也是如此。 size是字符数,最后一个字符是字符数 - 1 (s.charAt(s.length() - 1)

于 2013-11-12T03:04:54.457 回答