Java是否将字符串定义为以null结尾?

14

正如我的标题所示,这是一个理论问题。 我想知道Java是否将字符串定义为以null结尾。


@Reimeus,那么他们如何跟踪字符串的结尾?使用长度吗? - Dewsworld
之前在谷歌搜索过,但没看到这个问题。可能是重复的! - Dewsworld
Dewsworld,声称这是一个理论问题几乎是关闭的必然原因。SO应该是为你面临的实际问题而设立的。 - paxdiablo
2
@MatteoD - 那个问题实际上是关于另一件事的。它的标题有误导性。 - Stephen C
3个回答

14

我想知道Java是否将字符串定义为以null结尾。

不是。字符串被定义为长度固定的char值序列。字符串中可以使用所有可能的char值(从0到65535)。不存在一个“特殊”的值意味着字符串结束1

那么他们如何跟踪字符串的结尾?使用长度吗?

是的。一个String对象有一个私有的length字段(在我研究过的所有实现中都有...)。

如果您想了解更多关于Java字符串如何实现的信息,各种版本的源代码可在线获取。Google搜索“java.lang.String source”。


1 - 如前所述,JLS或String的javadoc并没有明确表示String实现不能使用NUL终止符。但是,String中包括NUL在内的所有字符都是重要的,这意味着NUL终止符不切实际。


10

Java字符串与C或C++不同,没有以空字符结尾。虽然Java字符串在内部使用char数组,但其中没有终止的null。String类提供了一个名为length的方法来获取字符串中字符的数量。

以下是简单代码及其调试器内容:

public static void main(String[] args) {
    String s = "Juned";
    System.out.println(s);
}

调试器截图:

在此输入图片描述


1
你有什么理由支持你的答案吗? - Josh M
@Juned Ahsan,你能否请稍微解释一下 :) - Dewsworld
4
Java是JLS,它不强制要求空终止符,但也不禁止使用。一个Java实现不使用空终止符的事实并不像你想象的那样重要。我不会给你投反对票,但你可能希望区分Java规范和实现之间的差异。 - paxdiablo
你能解释一下截图的意义吗? - Josh M
@Josh,很可能是因为s.value中没有[5] = '\0'这一行。 - paxdiablo
显示剩余2条评论

0

这有关紧要吗?

如果您将Java字符串转换为某种序列化格式(存储到磁盘、网络等),那么重要的是序列化格式,而不是JVM的内部格式。

如果您通过JNI在C代码中读取字符串的数据,则永远不会直接读取数据,而是始终使用JNI函数,例如GetStringChars()GetStringUTFChars()GetStringChars()未记录返回空终止数据,因此您不应假设它是空终止的-您必须使用GetStringLength()来确定其长度。 同样,对于GetStringUTFChars(),您必须使用GetStringUTF8Length()修改后的UTF-8格式确定其长度。


3
"Does it matter?" 嗯...了解计算机的工作原理是很好的。 - citelao
3
如果你担心在一个字符串中加入NUL字符会发生什么,这是很重要的。但是,如果你真的需要这样做,那么可以说你正在错误地使用String...因为在真实文本中,不应该出现NUL字符。(但我承认有一些情况下你可能仍然希望允许在String中使用NUL字符。) - Stephen C
1
很重要:今天我假设它们是以NUL结尾的,并在字符串中逃脱了一个\0,只是为了测试reverse()函数,然后进行了反转;令我惊讶的是,即使在\0之后,它也将其反转了,所以我来这里看看为什么 :) - alx - recommends codidact
Adam,虽然你已经表达得很清楚了,但你并没有回答问题。我点赞是因为你以一种引人注目的方式引起了我们对一个有趣问题的关注。 - Humberto Fioravante Ferro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接