我们何时应该将String更改为Stringbuilder?

Nei*_*fen 3 java string stringbuilder refactoring memory-management

在应用程序中,String是常用的数据类型.我们所知道的是,String的变异会占用大量内存.所以我们可以做的是使用StringBuilder/StringBuffer.

但是我们应该在什么时候改为StringBuilder?
当我们必须拆分它或在那里重新塑造角色时,我们应该怎么做?

例如:

 //original:
 String[] split = string.split("?");  
 //better? :  
 String[] split = stringBuilder.toString().split("?);
Run Code Online (Sandbox Code Playgroud)

要么

 //original:
 String replacedString = string.replace("l","st");  
 //better? :  
 String replacedString = stringBuilder.toString().replace("l","st");  
 //or  
 StringBuilder replacedStringBuilder = new StringBuilder(stringBuilder.toString().replace("l","st);
Run Code Online (Sandbox Code Playgroud)

Gro*_*roo 6

在您的示例中,使用a没有任何好处StringBuilder,因为您使用该toString方法来创建一个不可变StringStringBuilder.

只有在完成附加后(或以其他方式修改它)时,才应将a的内容复制StringBuilder到a中String.

Java的问题StringBuilder在于它缺少使用普通字符串时获得的一些方法(请检查此线程,例如:如何实现StringBuilder.replace(String,String)).

我们所知道的是,String使用大量内存.

实际上,准确地说,一个String使用更少比存储器StringBuilder具有等效内容.甲StringBuilder类有一些额外的恒定的开销,并且通常有一个预分配的缓冲器,用于存储比所需要的任何给定时刻(以减少分配)更多的数据.Strings 的问题是它们是不可变的,这意味着Java需要在需要更改其内容时创建新实例.

总而言之,StringBuilder不是为您提到的操作(拆分和替换)而设计的,并且在任何情况下都不会产生更好的性能.甲split方法不能受益StringBuilder的可变性,因为它产生不可变的串作为其输出的阵列反正.替换方法仍然需要遍历整个字符串,并且如果替换的字符串与搜索的字符串大小不同,则执行大量复制.

如果你需要做很多追加,那就去吧StringBuilder.由于它在引擎盖下使用"可变"字符数组,因此向末尾添加数据将特别有效.

本文比较了几个方法StringBuilderString方法的性能(虽然我会将Concatenation部分与reserve一起使用,因为它根本没有提到动态字符串附加,而Join只关注单个操作).