【问题标题】:How is memory alocated with Strings in Java?Java中的字符串是如何分配内存的?
【发布时间】:2017-02-14 10:06:17
【问题描述】:

有以下代码:

String s="JAVA";
for(i=0; i<=100; i++)
     s=s+"JVM";

创建了多少个字符串?我的猜测是创建了 103 个字符串:

1:字符串池中的字符串“JAVA”

1:字符串“JVM”也在字符串池中

101:每次循环都会创建新的Strings,因为String是一个不可变的类

【问题讨论】:

  • jit 可能会尝试用字符数组列表替换它,直到 s 被引用为 used
  • @huseyintugrulbuyukisik - 1) AFAIK,它不会......到目前为止的 Java 版本中。 2) 根据对 JLS 15.18.1 的严格阅读,JIT 编译器是不允许这样做的。

标签: java string memory string-pool


【解决方案1】:

字符串连接是通过StringBuilder(或StringBuffer)类及其append方法实现的。字符串转换通过toString 方法实现,由Object 定义并被Java 中的所有类继承。有关字符串连接和转换的更多信息,请参阅 Gosling、Joy 和 Steele,Java 语言规范。

在您的情况下,创建了 103 个字符串,循环中的每个字符串和两个字符串 JavaJVM

【讨论】:

  • JLS 声明字符串连接可以使用 StringBuilder 实现。它没有说明必须以这种方式实现。
【解决方案2】:

当在字符串上使用'+'操作符时,JAVA 每次都用 StringBuilder 替换它。

因此,对于每个循环,您创建一个 StringBuilder,它使用 append() 方法连接两个字符串(s 和 JVM),然后通过 toString() 方法将其转换为字符串

【讨论】:

    【解决方案3】:

    编译时字符串表达式被放入字符串池中。 s=s+"JVM" 不是编译时常量表达式。所以每次它在堆中创建一个新的字符串对象。

    更多详情请看Behavior of String literals is confusing

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2011-10-22
      • 2021-07-27
      • 2012-07-10
      • 2022-12-23
      • 2011-03-22
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多