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, 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。