java - c和java中字符的内存分配

标签 java c string

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

最佳答案

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

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

  1. 一个字符数组——因此是一个单独的对象——包含实际的字符;
  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计算字符串的长度其运行时间随着字符串的大小。

关于java - c和java中字符的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18439345/

相关文章:

javascript - 数组排列/组合

java - 在 spring-boot 2 中使用 gson 时返回 null

java - 列出依赖项时未找到 JDEPS 模块异常

c - 三个值的中位数

string - GO标志pkg读取包含诸如“\u00FC”之类的转义 rune 的选项字符串将不会读取

java - 从 Java Applet 到网页的最大字符串长度或其他字符串限制?

java - 将 Spring 项目从 tomcat 7 迁移到 tomcat 8

java - 在 Java 中使用 NULL 对象访问静态字段

c - 如何将 char(ASCII 字符)转换为保存在 C 字符串变量中的科学计数法

c - STM32 微 Controller 上哪些变量类型/大小是原子的?