正如我的标题所暗示的,这是一个理论问题。我想知道如果java将字符串定义为空终止。
3 回答
我想知道如果java将字符串定义为空终止。
不,字符串被定义为固定长度的char
值序列。所有可能的char
值(从 0 到 65535)都可以在字符串中使用。没有“可区分”值表示字符串以1结尾。
那么他们如何跟踪字符串结尾呢?使用长度?
是的。一个String
对象有一个私有length
字段(在我研究过的所有实现中......)。
如果您想了解更多关于 Java 字符串是如何实现的,可以在线获取各种版本的源代码。谷歌搜索“java.lang.String 源”。
1 - 如前所述,JLS 或 javadocs都没有String
明确表示String
实现不能使用 NUL 终止。但是,包括 NUL 在内的所有字符都很重要,这String
意味着 NUL 终止是不切实际的。
Java 字符串不会像在 C 或 C++ 中那样以空字符结尾。尽管 java 字符串在内部使用 char 数组,但其中没有终止 null。String 类提供了一个名为 length 的方法来知道字符串中的字符数。
这是简单的代码及其调试器内容:
public static void main(String[] args) {
String s = "Juned";
System.out.println(s);
}
调试器截图:
Does it matter?
If you convert a Java string into some kind of serialized format (onto disk, the network, etc.), then all that matters is the serialization format, not the JVM's internal format.
If you're reading the string's data in C code via JNI, then you never read the data directly, you always use JNI functions like GetStringChars()
or GetStringUTFChars()
. GetStringChars()
is not documented as returning null-terminated data, so you shouldn't assume that it's null-terminated—you must use GetStringLength()
to determine its length. Likewise with GetStringUTFChars()
, you must use GetStringUTF8Length()
to determine its length in modified UTF-8 format.