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)
在您的示例中,使用a没有任何好处StringBuilder,因为您使用该toString方法来创建一个不可变String的StringBuilder.
只有在完成附加后(或以其他方式修改它)时,才应将a的内容复制StringBuilder到a中String.
Java的问题StringBuilder在于它缺少使用普通字符串时获得的一些方法(请检查此线程,例如:如何实现StringBuilder.replace(String,String)).
我们所知道的是,String使用大量内存.
实际上,准确地说,一个String使用更少比存储器StringBuilder具有等效内容.甲StringBuilder类有一些额外的恒定的开销,并且通常有一个预分配的缓冲器,用于存储比所需要的任何给定时刻(以减少分配)更多的数据.Strings 的问题是它们是不可变的,这意味着Java需要在需要更改其内容时创建新实例.
总而言之,StringBuilder不是为您提到的操作(拆分和替换)而设计的,并且在任何情况下都不会产生更好的性能.甲split方法不能受益StringBuilder的可变性,因为它产生不可变的串作为其输出的阵列反正.替换方法仍然需要遍历整个字符串,并且如果替换的字符串与搜索的字符串大小不同,则执行大量复制.
如果你需要做很多追加,那就去吧StringBuilder.由于它在引擎盖下使用"可变"字符数组,因此向末尾添加数据将特别有效.
本文比较了几个方法StringBuilder和String方法的性能(虽然我会将Concatenation部分与reserve一起使用,因为它根本没有提到动态字符串附加,而Join只关注单个操作).
| 归档时间: |
|
| 查看次数: |
1582 次 |
| 最近记录: |