在应用程序中,字符串是一种常用的数据类型。我们知道,字符串的突变会占用大量内存。所以我们能做的就是使用 StringBuilder/StringBuffer。
但什么时候我们应该改用 StringBuilder 呢?
当我们必须拆分它或替换其中的字符时,我们应该做什么?
eg:
//original:
String[] split = string.split("?");
//better? :
String[] split = stringBuilder.toString().split("?);
or
//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);
在您的示例中,使用StringBuilder
,因为您使用toString
创建不可变的方法String
从你的StringBuilder
.
您应该只复制 a 的内容StringBuilder
into a String
完成附加它(或以其他方式修改它)后。
Java的问题StringBuilder
是它缺少使用纯字符串时获得的一些方法(检查此线程,例如:如何实现 StringBuilder.replace(String, String) https://stackoverflow.com/questions/1422390/how-to-implement-stringbuilder-replacestring-string-in-terms-of-string).
我们知道,字符串使用大量内存。
其实准确来说,一个String
uses less内存比StringBuilder
具有同等内容。 AStringBuilder
类有一些额外的常量开销,并且通常有一个预分配的缓冲区来存储比任何给定时刻所需的更多的数据(以减少分配)。问题与String
是他们是不可变的,这意味着每当需要更改其内容时,Java 都需要创建一个新实例。
总而言之,StringBuilder
不是为您提到的操作(拆分和替换)而设计的,并且在任何情况下都不会产生更好的性能。 Asplit
方法不能受益于StringBuilder
的可变性,因为它无论如何都会创建一个不可变字符串数组作为其输出。替换方法仍然需要遍历整个字符串,并且如果替换字符串的大小与搜索字符串的大小不同,则需要进行大量复制。
如果你需要做很多事情追加,然后去StringBuilder
。由于它在底层使用“可变”字符数组,因此将数据添加到末尾将特别有效。
本文 http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx比较几个的性能StringBuilder
and String
方法(尽管我会保留连接部分,因为它根本没有提到动态字符串附加,而是集中于单个Join
仅操作)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)