String、StringBuilder、StringBuffer和StringJoiner的区别以及使用

本文详细比较了Java中的String、StringBuilder和StringBuffer,强调了String的不可变性导致的内存消耗问题,推荐在频繁拼接时使用StringBuilder,同时介绍了StringBuilder的构造方法和链式操作,以及StringJoiner的使用及其优势。
摘要由CSDN通过智能技术生成

一、String、StringBuilder和StringBuffer的区别:

//String:"不可变"字符串

//StringBuilder:"可变"字符串

//StringBuffer:"可变"字符串

二、StringBuilder和StringBuffer的区别:

相同点:
//都是可变字符串,都继承自AbstractStringBuilder父类
//区别点:
//StringBuilder:线程不安全(每个方法没有加synchronized锁),性能好
 //StringBuffer:线程安全(每个方法都加synchronized锁),性能差不推荐使用

三、String

String ret="A"+"B"+"C";  

这句代码实现时。虽然输出结果是“ABC”,但是其实在内部产生了三个字符串,分别是 “A”,"AB","ABC",即每一次拼接都会产生一个新的字符串对象,这样在进行频繁的拼接时非常占用空间,还会影响效率

四、StringBuilder

因此,在进行频繁的字符串拼接时,应该选择“可变字符串”:StringBuilder,StringBuilder是可变的对象,可以预分配缓冲区,这样在StringBuilder中新增字符时,不会创建新的临时对象

创建1个可变字符串

方法一:内部的char[]字符数组采用默认容量16

StringBuilder s1=new StringBuilder();

StringBuilder 

方法二:内部的char[]字符数组采用指定容量256

StringBuilder s2=new StringBuilder(256);

方法三:内部的char[]字符数组采用指定字符串长度+16

StringBuilder s3=new StringBuilder("A");

StringBuilder的应用

StringBuilder可以进行链式操作,即

1.append():追加字符串

用append()方法直接向当前字符串s3的尾部追加字符串,将处理后的结果存会回原对象,不会产生新的字符串

StringBuilder s3=new StringBuilder("A");
s3.append("B")
  .append("C")
  .append("D");
System.out.println(s3);

输出结果:ABCD

2.insert():插入字符串

用insert()方法直接在s3指定位置插入,将处理后的结果存会回原对象,不会产生新的字符串

StringBuilder s3=new StringBuilder("ABCD");
s3.insert(0,"a");
System.out.println(s3);

输出结果:aABCD

3.delete():删除字符串

用delete()方法直接删除指定位置的元素,将处理后的结果存会回原对象,而不会产生新对象

StringBuilder s3=new StringBuilder("aABCD");
s3.delete(0,1)//删除[0,1),即第一位
s3.delete(0,2)删除[0,2),即第一位和第二位
System.out.println(s3);

输出结果:CD

五、String和StringBuilder的使用对比

String类型的对象s在进行替换时,每替换一次都会产生一个临时的字符串。StringBuilder的对象sb直接在他自己的原串上进行替换

//将空格替换为%20
String s="just do it";
//方法一:String的replace()方法
String ret=s.replace(" ","20%");
//方法二:StringBuilder的replace()方法
//创建一个StringBuilder对象sb,将s的内容存入sb
StringBuilder sb=new StringBuilder(s);
int index=-1;
//如果sb中存在空格,将其下标赋值给index,存在则index>0,若不存在则跳出循环
while((index=sb.indexOf(" "))>0){
    sb.reolace(index,index+1,"20%");
}
System.out.println(ret);
System.out.println(sb);

六、StringJoiner

//下述例子分别使用String、String.join()、StringBuilder和StringJoiner实现将:cityArr拼接成{"西安","宝鸡","咸阳"}

String[] cityArr= {"西安","宝鸡","咸阳"};
//1.使用String.join()拼接
String ret1=String.join(",",cityArr);
ret1="{"+ret1+"}";
System.out.println("ret1:"+ret1);
//2.使用StringBuilder()
System.out.println("ret:"+Arrays.toSting(cityArr));
//3.使用StringJoiner()
//设置分隔符
StringJoiner joiner1 =new StringJoiner(",");
for(String cityName1:cityArr) {
	joiner1.add(String.format("\"%s\"", cityName1));
}
String ret2=joiner1.toString();
System.out.println(ret2);
//设置分隔符、左右关闭符号(开始符号和结束符号)
StringJoiner joiner2=new StringJoiner(",","{","}");
for(String cityName:cityArr){
//设置各元素的双引号
    joiner2.add(String.format("\"%s\"",cityName));
}
String ret3=joiner2.toString();
System.out.println("ret2:"+ret2);
System.out.println("ret3:"+ret3);

//输出结果:

ret1:{西安,宝鸡,咸阳}
ret:[西安, 宝鸡, 咸阳]
ret2:"西安","宝鸡","咸阳"
ret3:{"西安","宝鸡","咸阳"}

//所以可以看出,用StringJoiner和String.join()可以使用指定分隔符拼接字符串数组,但是StringJoiner可以额外附加一个”开头“"结尾"

  • 47
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值