string
string是常量类,一经声明不可改变,强行赋值实则创建新的一个常量;
创建常量开销大于stringbuffer和stringbuilder;
StringBuffer:
继承AbstractStringBuilder,实现序列化和charSequence
重写的方法都带有synchronize关键字,所以stringBuffer是线程安全的;但是synchronize加锁的同时会带来额外开销.在执行上stringbuffer又比stringbuilder慢;
stringbuilder:
虽然只截取了部分重写的方法但是可以看到stringbuilder并没有在线程方面做处理;
同stringbuffer一样继承自AbstractStringBuilder;是serializable和charSequence类的实现类;所以他们的方法是 一样的,实现上
在new一个stringbuffer和stringbuilder时候都是默认给16个单位的的字节数组
再看看父类的append方法
string类的getchars方法
明显调用了arraycopy方法整个复制过去到value中 ( value是之前的字节数组)
在stringBuffer中这个操作是加了synchronize关键字的,是线程安全的;
综上:
- 执行速度上:stringbuilder > stringbuffer > string
- 线程安全上: StringBuffer是线程安全的,stringbuilder 是非线程安全;
- 使用场景:
- string适合少量字符串操作情况;
- stringbuilder适合单线程下载 字符缓冲区进行大量操作;
- stringbuffer 适合多线程下字符缓冲区进行大量操作;