【问题标题】:StringBuilder / StringBuffer with literal string in memory [duplicate]StringBuilder / StringBuffer 与内存中的文字字符串[重复]
【发布时间】:2019-05-21 10:11:17
【问题描述】:

示例代码:

StringBuffer sb = new StringBuffer("hi");
sb = null;

问题:

字符串“hi”是否会以某种方式保留在内存中,即使在 StringBuffer 已被垃圾回收之后?或者它只是用来为 StringBuffer 创建一个 char 数组,然后从不放在内存中的任何地方?

【问题讨论】:

  • 首选StringBuilder 而不是StringBuffer。至于文字String,这取决于你的Java版本以及它是否在intern池中。
  • 似乎字符串文字被放入字符串池并在程序运行时保留在内存中。
  • @ElliottFrisch 我认为您必须返回相当多的方法才能找到没有被实习的字符串文字。
  • @OleV.V.好吧,等待优化器删除不必要的操作和不请求操作是有区别的。因此,无论差异多么微小,由于没有任何其他功能差异,仍然有理由更喜欢StringBuilder。毕竟,您必须决定其中任何一个。
  • StringBuffer 将复制传递给它的构造函数的参数,但不包含对它的任何引用,因此,它是否被垃圾收集,与 @ 的生命周期完全无关987654328@字符串实例。

标签: java string garbage-collection stringbuilder stringbuffer


【解决方案1】:

是的,hi 是一个编译时常量,因此它被编译器拦截并驻留在字符串池中。

此外,G1GC 可以作为 JEP 192: String Deduplication in G1 的一部分执行字符串重复数据删除,在这种情况下,即使 hi 没有被 javac 实习,它也可能作为重复数据删除的一部分保留。

【讨论】:

    【解决方案2】:

    字符串文字总是引用类String 的同一个实例。这是因为字符串字面量 - 或者更一般地说,作为常量表达式 (§15.28) 的值的字符串 - 是“内部的”,以便使用 String.intern 方法共享唯一实例。

    JLS 11 > 3. Lexical Structure > 3.10.5. String Literals

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 2019-03-09
      • 2015-12-13
      • 2011-06-06
      • 2017-05-27
      • 2010-09-09
      • 2010-10-29
      • 2015-12-23
      相关资源
      最近更新 更多