3

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

4

2 回答 2

4

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

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

  1. 一个 char 数组——因此是一个单独的对象——包含实际的字符;
  2. 字符串开始的数组中的整数偏移量;字符串的长度;
  3. 另一个用于缓存计算哈希码的int 。

这意味着即使字符串不包含字符,它也需要 4 个字节用于 char 数组引用,加上 3*4=12 个字节用于三个 int 字段,再加上 8 个字节的对象头。这给出了 24 个字节(这是 8 的倍数,因此到目前为止不需要“填充”字节)。然后,(空)char 数组将需要另外 12 个字节(数组有额外的 4 个字节来存储它们的长度),在这种情况下加上 4 个字节的填充,以使 char 数组对象使用的内存达到16. 因此,一个空字符串总共使用 40 个字节。

通过字符串计算内存使用量,您必须考虑到数组中的字符是 2 个字节的事实。

JAVA->String.length()是字符串中包含的字符数的常数时间操作,因为java字符串类将长度存储为一个字段。

C-> strlen()遍历整个数组,直到\0计算字符串的长度,它的运行时间随着字符串的大小而增长。

于 2013-08-26T08:18:41.843 回答
1

AC 字符串是nul字节终止的字节序列。

Java 字符串是一个长度已知并引用 16 位数组的对象chars

String 的内存分配要高得多,但它支持 UTF-16 字符和 O(1) 长度操作。即在某些情况下它可以更快。

于 2013-08-26T08:02:39.320 回答