StringBuilder与StringBuffer
简介
StringBuffer和StringBuilder非常类似,均代表可变的字符序列,而且使用方法也一样 。
- StringBuilder:可变字符序列、效率高、线程不安全
- StringBuffer:可变字符序列、效率低、线程安全
- String:不可变字符序列
更改可变字符序列
代码
/**
* 测试StringBuilder、 StringBuffer,都是可变字符序列
* 位于java.lang包中
* @author dxt
*
*/
public class TestStringBuilder {
public static void main(String[] args){
//StringBuilder线程不安全,效率高;StringBuffer线程安全,效率低
StringBuilder sb = new StringBuilder("abcdefg");
//打印地址
System.out.println(Integer.toHexString(sb.hashCode()));
System.out.println(sb);
//更改可变字符序列sb的第一个字符
sb.setCharAt(0, 'A');
System.out.println(Integer.toHexString(sb.hashCode()));
System.out.println(sb);
}
}
结果
可以看到两次打印的sb的地址是相同的,即是同一个对象,但其中的内容是不同的,即是可变的字符序列。原因是StringBuilder对象使用char[] 来保存字符序列,而String使用final char[]来保存字符序列。
StringBuilder类中的常用方法
方法:
- append()
- reverse()
- setCharAt()
- insert()
- delete()
代码:
/**
* 测试一些StringBuilder中的一些方法
* @author dxt
*
*/
public class TestStringBuilder2 {
public static void main(String[] args){
StringBuilder sb = new StringBuilder();
//构造一个26个英文字母的字符序列
for(int i=0; i<26; i++){
char temp = (char)('a' + i);
sb.append(temp); //1. 在字符串后添加字符
}
System.out.println(sb);
//2. 倒序
sb.reverse();
System.out.println(sb);
//3. 更改对应索引的字符
sb.setCharAt(0, 'A');
System.out.println(sb);
//4. 在指定位置插入字符,返回自己
sb.insert(0, "Z");
System.out.println(sb);
//5. 删除一定区间的字符
sb.delete(0, 2);
System.out.println(sb);
//6. StringBuilder 也有String中一些类似的方法
System.out.println(sb.charAt(0));
System.out.println(sb);
}
}
测试可变字符序列和不可变字符序列使用时的陷阱
代码:
/**
* 测试可变字符序列和不可变字符序列使用时的陷阱
* @author dxt
*
*/
public class TestStringBuilder3 {
public static void main(String[] args){
//1. 使用String进行字符串的拼接
String str = "";
//循环5000次,每一次循环都会舍弃之前的str对象,创建一个新的str对象,同时会将i转为对象
for(int i=0; i<5000; i++){
str = str + i; //会产生10000个对象
}
//2. 对以上代码进行修改,使之合理
StringBuilder sb = new StringBuilder();
for(int i=0; i<5000; i++){
sb.append(i);
}
}
}
进行字符串的循环累加操作时,一定不要使用String。
来源:CSDN
作者:dxt_snow
链接:https://blog.csdn.net/qq_37665301/article/details/104473825