初始化StringBuilder以使用UTF-16编码器

Dod*_*ion 5 java stringbuilder java-11

考虑一下Java 11中的以下代码:

StringBuilder sb = new StringBuilder("one");
sb.append("???");  // "two"
Run Code Online (Sandbox Code Playgroud)

第一行创建一个StringBuilder使用Latin1编码器的编码(每个字符一个字节)。然后,第二行使StringBuilder意识到它需要改用UTF16编码器,因此在附加新的UTF-16字符之前,它将其当前内容复制到新的数组中。

StringBuilder类的构造函数重载带有初始容量参数,如果您已经知道要构建的字符串的所需大小,则可以避免重新分配。但是,如果您以英语字符串开头,然后追加一个外部字符串,则此特殊的构造方法重载是无用的,因为它仍会重新分配字节数组。

有没有一种方法可以从一开始就创建使用UTF16的StringBuilder实例?

Ste*_*n C 3

Java 11 或 Java 12 版本中没有任何东西StringBuilder可以做到这一点。

真正的问题是您可能从中获得的性能增量对您来说有多重要。 分析您的应用程序,了解这种不必要的重新分配是否对应用程序的整体性能有显着影响。

如果它将产生重大影响,您可以实现自己的版本StringBuilder(扩展相同的接口以实现兼容性)。

或者,如果您准备等待,您可以下载 OpenJDK 源代码并开发/构建/测试扩展StringBuilder...并将其作为补丁提交以供考虑。(如果您包含的基准显示出明显的性能优势,这将有助于增加包含的机会。)