java的空终止符

时间:2013-11-12 02:57:43

标签: java arrays

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

例如:

char foo[] = new foo[5]; 

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

System.out.println(foo);

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

2 个答案:

答案 0 :(得分:3)

An array of characters is not a String.字符串a char[]

通过JLS,它们是两个独立的,定义明确的实体。字符串是不可改变的;数组不是

char[]的实际尺寸也是5defined by the JLS。由于索引始终是从零开始的,因此您只能访问索引位置0-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;
}

答案 1 :(得分:1)

也许您将sizeindex混为一谈。 size总是有多少元素,最后一个索引是多少元素 - 1 (c.length - 1)。 String也是如此。 size是chararters的数量,最后一个字符是字符数 - 1 (s.charAt(s.length() - 1)