在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终止符?
答案 0 :(得分:3)
An array of characters is not a String.字符串a char[]
。
通过JLS,它们是两个独立的,定义明确的实体。字符串是不可改变的;数组不是。
char[]
的实际尺寸也是5
,defined 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)
也许您将size
与index
混为一谈。 size
总是有多少元素,最后一个索引是多少元素 - 1 (c.length - 1)
。 String也是如此。 size
是chararters的数量,最后一个字符是字符数 - 1 (s.charAt(s.length() - 1)
。