内存空间分配如何影响(C)和Java中的字符串长度操作? (这是指C字符串变量每个字包含4个字节的事实,其中java字符串变量每个字包含两个半字)
答案 0 :(得分:4)
事实是C中没有任何C字符串变量,它们只是数组;字符数组。 C中的一个char
占用1 byte
。字符串文字只是存储为一个字符数组,并在末尾附加终止\0
。
在Java编程语言中,字符串是对象。 String包含以下内容:
这意味着即使字符串不包含字符,它也需要4个字节用于char数组引用,加上3 * 4 = 12个字节用于三个int字段,再加上8个字节的对象头。这给出了24个字节(这是8的倍数,因此到目前为止还不需要“填充”字节)。然后,(空)char数组将需要另外12个字节(数组有额外的4个字节来存储它们的长度),在这种情况下还有4个字节的填充,以使char数组对象使用的内存达到倍数16.总的来说,空字符串使用40个字节。
通过字符串计算内存使用量,您必须考虑到数组中的字符为2个字节这一事实。
JAVA-> String.length()
是字符串中包含的字符数的常量时间操作,因为java字符串类将长度存储为字段。
C-> strlen()
遍历整个数组,直到\0
计算其运行时增长的字符串长度和字符串的大小。
答案 1 :(得分:1)
C字符串是以nul
字节终止的字节序列。
Java String是一个已知长度的Object,它引用了一个16位chars
的数组
String的内存分配要高得多,但它支持UTF-16字符和O(1)长度操作。即在某些情况下可能更快。