c和java中字符的内存分配

时间:2013-08-26 07:59:29

标签: java c string

内存空间分配如何影响(C)和Java中的字符串长度操作? (这是指C字符串变量每个字包含4个字节的事实,其中java字符串变量每个字包含两个半字)

2 个答案:

答案 0 :(得分:4)

事实是C中没有任何C字符串变量,它们只是数组;字符数组。 C中的一个char占用1 byte。字符串文字只是存储为一个字符数组,并在末尾附加终止\0

在Java编程语言中,字符串是对象。 String包含以下内容:

  1. 一个字符数组 - 因此是一个单独的对象 - 包含实际字符;
  2. 整数偏移量到字符串开始的数组中; 字符串的长度;
  3. 另一个int ,用于缓存代码的缓存计算。
  4. 这意味着即使字符串不包含字符,它也需要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)长度操作。即在某些情况下可能更快。