StringBuffer,StringBuilder和String 源码解读差别

string

StringBuffer,StringBuilder和String 源码解读差别_第1张图片

string是常量类,一经声明不可改变,强行赋值实则创建新的一个常量;

创建常量开销大于stringbuffer和stringbuilder;

 

 

 

StringBuffer:

StringBuffer,StringBuilder和String 源码解读差别_第2张图片

StringBuffer,StringBuilder和String 源码解读差别_第3张图片

 

继承AbstractStringBuilder,实现序列化和charSequence

重写的方法都带有synchronize关键字,所以stringBuffer是线程安全的;但是synchronize加锁的同时会带来额外开销.在执行上stringbuffer又比stringbuilder慢;

 

stringbuilder:

StringBuffer,StringBuilder和String 源码解读差别_第4张图片

 

StringBuffer,StringBuilder和String 源码解读差别_第5张图片

 

虽然只截取了部分重写的方法但是可以看到stringbuilder并没有在线程方面做处理;

同stringbuffer一样继承自AbstractStringBuilder;是serializable和charSequence类的实现类;所以他们的方法是 一样的,实现上

StringBuffer,StringBuilder和String 源码解读差别_第6张图片

 

StringBuffer,StringBuilder和String 源码解读差别_第7张图片

 

StringBuffer,StringBuilder和String 源码解读差别_第8张图片

在new一个stringbuffer和stringbuilder时候都是默认给16个单位的的字节数组

 

再看看父类的append方法

StringBuffer,StringBuilder和String 源码解读差别_第9张图片

 

StringBuffer,StringBuilder和String 源码解读差别_第10张图片

 

string类的getchars方法

StringBuffer,StringBuilder和String 源码解读差别_第11张图片

明显调用了arraycopy方法整个复制过去到value中 ( value是之前的字节数组)

在stringBuffer中这个操作是加了synchronize关键字的,是线程安全的;

 

综上:

  1. 执行速度上:stringbuilder > stringbuffer > string
  2. 线程安全上: StringBuffer是线程安全的,stringbuilder 是非线程安全;
  3. 使用场景:
  • string适合少量字符串操作情况;
  • stringbuilder适合单线程下载 字符缓冲区进行大量操作;
  • stringbuffer 适合多线程下字符缓冲区进行大量操作;

 

你可能感兴趣的:(java)