当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
以上实例编译运行结果如下:
Runoob.. Runoob..! Runoob..Java! RunooJava!
然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
以上实例编译运行结果如下:
菜鸟教程官网:www.runoob.com
以下是 StringBuffer 类支持的主要方法:
| 序号 | 方法描述 |
|---|---|
| 1 |
public StringBuffer append(String s) 将指定的字符串追加到此字符序列。 |
| 2 |
public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
| 3 |
public delete(int start, int end) 移除此序列的子字符串中的字符。 |
| 4 |
public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
| 5 |
insert(int offset, String str)
将 str 参数的字符串插入此序列中。 |
| 6 |
replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
以下列表列出了 StringBuffer 类的其他常用方法:
| 序号 | 方法描述 |
|---|---|
| 1 |
int capacity() 返回当前容量。 |
| 2 |
char charAt(int index) 返回此序列中指定索引处的 char 值。 |
| 3 |
void ensureCapacity(int minimumCapacity) 确保容量至少等于指定的最小值。 |
| 4 |
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符从此序列复制到目标字符数组 dst。 |
| 5 |
int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。 |
| 6 |
int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。 |
| 7 |
int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引。 |
| 8 |
int lastIndexOf(String str, int fromIndex) 返回 String 对象中子字符串最后出现的位置。 |
| 9 |
int length() 返回长度(字符数)。 |
| 10 |
void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch。 |
| 11 |
void setLength(int newLength) 设置字符序列的长度。 |
| 12 |
CharSequence subSequence(int start, int end) 返回一个新的字符序列,该字符序列是此序列的子序列。 |
| 13 |
String substring(int start) 返回一个新的 String,它包含此字符序列当前所包含的字符子序列。 |
| 14 |
String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列。 |
| 15 |
String toString() 返回此序列中数据的字符串表示形式。 |
更多内容:
我正在用Java循环遍历结果集;出于测试目的,它返回大约30行,每行17列(所有字符串数据)。我正在使用StringBuilder从结果中手动构建一个XML字符串,并且循环完成这些迭代实际上需要大约36秒。注意:我意识到这不是从数据库中获取XML的最佳方式,甚至不是从结果集中获取XML的最佳方式-但无论如何这都让我对缓慢的性能感到好奇。更新:根据目前的回复,我必须解决以下问题:运行查询的时间不到一秒,我在代码的每个部分前后都执行了System.currentTimeMillis()以缩小范围。36秒完全在下面的代码中。ResultSetMetaDatarsmeta=rset.getMe
我有一个包含XML文件内容的StringBuilder。在XML文件中有一个名为的根标签。并包含多个标签。我想通过XML进行解析以读取s中的标签值,但不确定该怎么做。我必须为此使用一些C#XML数据类型吗?提前致谢 最佳答案 StringBuildersb=newStringBuilder(xml);TextReadertextReader=newStringReader(sb.ToString());XDocumentxmlDocument=XDocument.Load(textReader);varnodeValueList=f
我编写了一个控制台应用程序来从Web服务器获取一些信息,将其转换为XML并保存。我手动创建了XML(使用StringBuilder附加字符串)。由于XML可能非常大,就内存而言,使用StringBuilder或XMLDocument类等更好吗?准确地说,我的问题是,如果XML类似于10mb文本,使用StringBuilder.append("")或System.XML命名空间是否具有内存效率?我认为更有效的方法是使用StringBuilder,但在每次迭代后将XML保存到HD上的文件并清除stringbuilder对象。任何意见?提前致谢。:) 最佳答案
我正在尝试从提供Xml内容的自定义HttpHandler中尽可能多地发挥性能。我想知道哪个对性能更好。使用XmlTextWriter类或临时StringBuilder操作,例如:StringBuildersb=newStringBuilder("");sb.AppendFormat("{0}",SOMEVALUE);有没有人有第一手经验? 最佳答案 正如Josh所说,这是一个微优化,如果您还没有证明它的必要性,您甚至不应该考虑它。它也确实不难测试:staticvoidMain(string[]arguments){constinti
我有一个现有的StringBuilder对象,代码向它附加了一些值和一个分隔符。我想修改代码以添加逻辑,在附加文本之前,它将检查它是否已存在于StringBuilder中。如果没有,它只会追加文本,否则将被忽略。这样做的最佳方法是什么?我需要将对象更改为string类型吗?我需要不会影响性能的最佳方法。publicstaticstringBuildUniqueIDList(contextRequestContext){stringrtnvalue=string.Empty;try{StringBuilderstrUIDList=newStringBuilder(100);for(int
我很想知道我是否可以创建一个优化版本的StringBuilder(尝试稍微加快它的速度,因为它目前是我的一个应用程序的瓶颈)。对我来说不幸的是,它似乎利用了我无法使用(或者看起来如此)的“神奇”系统调用。反编译System.Text.StringBuilder的源代码后,我注意到它使用了以下内部(因此无法调用)系统调用:[SecurityCritical][MethodImpl(MethodImplOptions.InternalCall)]internalstaticstringFastAllocateString(intlength);还有这个未记录的属性被大量使用:[ForceT
我有返回字符串的异步方法(来自网络)。asyncTaskGetMyDataAsync(intdataId);我有:Task[]tasks=newTask[max];for(inti=0;i如何将每个任务的结果附加到StringBuilder?我想知道怎么做A)按照任务创建的顺序B)为了完成任务我该怎么做? 最佳答案 A)InorderoftaskcreationTask[]tasks=newTask()[max];for(inti=0;iB)InorderthattasksfinishTask[]tasks=newTask()[ma
我在C#中连接大量byte[]数组。如果我对字符串执行此操作,我会使用StringBuilder——是否有适用于byte[]数组中的二进制数据的等效类? 最佳答案 我不认为有一个完全等价的东西,但你可以用BinaryWriter来完成它:http://msdn2.microsoft.com/en-us/library/system.io.binarywriter.aspxMemoryStreamm=newMemoryStream();BinaryWriterwriter=newBinaryWriter(m);writer.Write
我在StringBuilder对象中存储了一个密码。我正在寻找一种方法来删除内存中的密码。以下任何一种方法都可以实现这一点:遍历StringBuilder字符并分配'\0'。是如果我已经分配,这保证使用相同的内存最初有足够的内存吗?我可以使用任何非托管API,例如ZeroMemory()或SecureZeroMemory()使用StringBuilder?有代码示例吗?编辑:使用SecureString不是我的选择,因为我正在调用CredUIPromptForCredentials()来获取凭据。 最佳答案 简单的答案是,您提出
为什么StringBuilder比+连接更慢?StringBuilder旨在避免创建额外的对象,但为什么会降低性能?staticvoidMain(string[]args){intmax=1000000;for(inttimes=0;times编辑:按照建议移出范围变量: 最佳答案 更改以便StringBuilder不会一直实例化,而是.Clear()它:time:1String+:3348msStringBuilder:3151mstime:2String+:3346msStringBuilder:3050ms等请注意,这仍然会测