【问题标题】:How is a StringBuilder implemented to avoid the immutable string allocation problem?如何实现 StringBuilder 以避免不可变字符串分配问题?
【发布时间】:2019-05-30 03:11:09
【问题描述】:

如何实现StringBuilder 以避免不可变字符串分配问题?

StringBuilder aliasA = new StringBuilder("a");
StringBuilder dot = new StringBuilder(".");
Clausula clause1 = new Clausula(aliasA.append(dot).append("id").toString());
Clausula clause2 = new Clausula(aliasA.append(dot).append("name").toString());

【问题讨论】:

  • 也许你可以查看StringBuilder的代码,它是开源的。
  • 因为附加到 StringBuilder 不会创建新对象。
  • 您可以阅读以下内容。我会阐明一些观点。 docs.oracle.com/javase/tutorial/java/data/buffers.html
  • StringBuilderString 基本相同,因为两者都主要是char[] 的包装器。唯一(相关的)区别是 StringBuilder 提供 API 方法来更改该数组,而 String 没有。

标签: java string stringbuilder


【解决方案1】:

在幕后它使用char[](或JDK 9 或更新版本中的byte[])来存储字符。只有在调用StringBuilder.toString() 之后才会创建新的String 对象。

【讨论】:

    【解决方案2】:

    通过使用char 数组。您可以在 JDK 源代码中看到这一点。在 JDK 1.8(我有方便的源代码)中,StringBuilder 构建在 AbstractStringBuilder 之上,它使用它来保存数据:

    char[] value;
    int    count;
    

    Karol Dowbecki saysJDK 9“有时”使用byte而不是char;我没有理由怀疑他。:-))

    count 告诉类value 中有多少是实际数据与数组中的可用空间。它以char[16] 开头(除非您提前告诉它您可能需要什么容量),然后根据需要重新分配和复制。

    它只在您调用toString 时创建一个字符串,使用String(char[],int,int) constructor(或者可能是接受byte[],有时是JDK9)来复制实际使用的数组内容部分:

    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多