正如我的标题所示,这是一个理论问题。 我想知道Java是否将字符串定义为以null结尾。
我想知道Java是否将字符串定义为以null结尾。
不是。字符串被定义为长度固定的char
值序列。字符串中可以使用所有可能的char
值(从0到65535)。不存在一个“特殊”的值意味着字符串结束1。
那么他们如何跟踪字符串的结尾?使用长度吗?
是的。一个String
对象有一个私有的length
字段(在我研究过的所有实现中都有...)。
如果您想了解更多关于Java字符串如何实现的信息,各种版本的源代码可在线获取。Google搜索“java.lang.String source”。
1 - 如前所述,JLS或String
的javadoc并没有明确表示String
实现不能使用NUL终止符。但是,String
中包括NUL在内的所有字符都是重要的,这意味着NUL终止符不切实际。
Java字符串与C或C++不同,没有以空字符结尾。虽然Java字符串在内部使用char数组,但其中没有终止的null。String类提供了一个名为length的方法来获取字符串中字符的数量。
以下是简单代码及其调试器内容:
public static void main(String[] args) {
String s = "Juned";
System.out.println(s);
}
调试器截图:
s.value
中没有[5] = '\0'
这一行。 - paxdiablo这有关紧要吗?
如果您将Java字符串转换为某种序列化格式(存储到磁盘、网络等),那么重要的是序列化格式,而不是JVM的内部格式。
如果您通过JNI在C代码中读取字符串的数据,则永远不会直接读取数据,而是始终使用JNI函数,例如GetStringChars()
或GetStringUTFChars()
。 GetStringChars()
未记录返回空终止数据,因此您不应假设它是空终止的-您必须使用GetStringLength()
来确定其长度。 同样,对于GetStringUTFChars()
,您必须使用GetStringUTF8Length()
以修改后的UTF-8格式确定其长度。
NUL
字符会发生什么,这是很重要的。但是,如果你真的需要这样做,那么可以说你正在错误地使用String
...因为在真实文本中,不应该出现NUL
字符。(但我承认有一些情况下你可能仍然希望允许在String
中使用NUL
字符。) - Stephen C