考虑Java 11中的以下代码:
StringBuilder sb = new StringBuilder("one");
sb.append("δύο"); // "two"
第一行创建了一个使用Latin1编码器的StringBuilder
(每个字符一个字节)。然后,第二行代码使StringBuilder意识到它需要使用UTF16编码器,因此它在附加新的UTF-16字符之前将其当前内容复制到一个新的数组中。
StringBuilder类有一个接受初始容量参数的构造函数重载,如果您已经知道要构建的字符串的所需大小,则该参数旨在避免重新分配。但是如果你从一个英文字符串开始,然后追加一个外来字符串,这个特殊的构造函数重载是无用的,因为它仍然会重新分配字节数组。
有没有办法从一开始就使用UTF16创建StringBuilder实例?
发布于 2019-05-30 18:41:13
似乎没有明显的原因。如果你想影响StringBuffer的初始化方式,我的建议是创建一个实现CharSequence
的实用工具'initializer‘,并使用相应的StringBuilder构造函数。您可以使用它传递任何长度和字符内容,并且StringBuilder内部应该足够智能,能够识别它。
但是,看看OpenJDK 11的实现,似乎无论如何都要从Latin1开始。某种形式的重新分配似乎总是会发生。
https://stackoverflow.com/questions/56376298
复制相似问题