StringBuffer和StringBuilder

String,StringBuffer,StringBuilder三者的异同?

  • String:不可变的字符序列
  • StringBuffer:可变的字符序列:线程安全的(里面的方法都是同步方法),效率低
  • StringBuilder:可变的字符序列:线程不安全的,效率高
    三者底层都是使用char[]存储的,只不过String加了final,后面两个没加

正是因为String是不可变的字符序列,所以它的对字符串操作的一些方法都有返回值类型,如String toUpperCase()
而StringBuffer和StringBuilder是可变的字符序列,所以对字符串操作的一些方法虽然有返回值类型的,如StringBuffer append(xxx),但是一般不接受,如str.append(),因为str已经变了,很少用另一个字符串去接收

String与StringBuffer、StringBuilder之间的转换

  • String—>StringBuffer,StringBuilder:调用StringBuffer,StringBuilder的构造器
  • StringBuffer,StringBuilder—>String:调用String的构造器或者调用StringBuffer,StringBuilder的toString()方法

对比String,StringBuffer,StringBuilder的效率:
从高到低排列:StringBuilder > StringBuffer > String

String源码分析:
String s=new String();/底层是char[] value=new char[0];
String s=new String(“abc”);底层是char[] value=new char[]{'a', 'b', 'c'};
StringBuffer源码分析(StringBuilder类似):
StringBuffer s=new StringBuffer();char[] value=new char[16];底层创建了一个长度是16的char数组
s.append(‘a’);value[0]='a';
StringBuffer s=new StringBuffer(“abc”);char[] value=new char["abc".length()+16];底层创建了一个长度为3+16=19的char数组
StringBuffer常见问题和错误(StringBuilder类似)

  • 问题1:System.out.println(s);//输出是3
  • 问题2:扩容问题:如果要添加的数据底层的数组存不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。特殊情况见源码
  • 指导意义:开发中如果需要一个字符串经常变,如经常调用append(),则尽量用StringBuffer(当可能出现线程安全问题时)和StringBuilder(当没有线程安全问题时),而少使用String。开发中建议使用StringBuffer(int capacity)和StringBuilder(int capacity)构造器,尽量避免去扩容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值