String,StringBuffer,StringBuilder黑马精华贴

        StringBuffer, StringBuilder 都实现了CharSequence接口,意思都是字符序列,他们的底层都是用char[]实现的。
StringBuffer, StringBuilder是可变的,意思是你在生成其对象后可以改变其内部的char[],比如扩容,插入,删除等,这两个类是用于动态创建字符串的。这两者都是继承于AbstractStringBuilder,也就是他们具有相同的API(调用方式相同)。
         两者间的不同唯一就是StringBuffer是线程安全的(可用于并发环境),StringBuilder不是线性安全的(不能用于并发环境,如果使用,可能会出现问题)。当在单线程环境时最好使用StringBuilder,应为他不用检查对象锁,所以速度、效率要更高。
  概括的说:
           StringBuffer线程同步,安全,效率低(少量数据看不出差别)
           StringBuilder不同步,效率高
           String[] 长度不可变。上面两个长度可变(原因:上面两个底层实现也是String类型的数组,只不过根据需求,增加容量,同时将原来String数组中的元素拷贝到新的String数组中)。
以下供参考:
String中的是常量(final)数组,只能被赋值一次。
      比如:new String("abc")使得value[]={'a','b','c'}( 查看jdk String 就是这么实现的 ),之后这个String对象中的value[]再也不能改变了。

StringBuffer中的value[]就是一个很普通的数组,而且可以通过append()方法将新字符串加入value[]末尾。这样也就改变了value[]的内容和大小了。

      比如:new StringBuffer("abc")使得value[]={'a','b','c','',''...}(注意构造的长度是str.length()+16)。如果再将这个对象append("abc"),那么这个对象中的value[]={'a','b','c','a','b','c',''....}。这也就是为什么大家说 StringBuffer是可变字符串 的涵义了。从这一点也可以看出,StringBuffer中的value[]完全可以作为字符串的缓冲区功能。

总结,讨论String和StringBuffer可不可变。本质上是指对象中的value[]字符数组可不可变,而不是对象引用可不可变。

StringBuffer和StringBuilder可以算是双胞胎了,这两者的方法没有很大区别,数组方面看上边 StringBuffer。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值