String,StringBuilder,StringBuffer区别,竟有这么多不同

String,StringBuilder,StringBuffer区别,竟有这么多不同

? 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家
? 擅长领域:全栈工程师、爬虫、ACM算法
? 公众号:知识浅谈

从源代码看String,StringBuilder,StringBuffer区别
?这次以JDK1.8的版本,Jdk1.8以上底层数组采用了byte?

正菜来了⛳⛳⛳

?区别一:安全相关

  • String 和 StringBuilder是线程不安全的;
  • StringBuffer是线程安全的。

为何?
因为StringBuffer在append,delete,等等方法上加了synchronized锁,所以就是线程安全的。
这里拿出底层实现的几个方法:

@Override
public synchronized int length() {
return count;
}
@Override
public synchronized int capacity() {
return value.length;
}
@Override
public synchronized void ensureCapacity(int minimumCapacity) {
super.ensureCapacity(minimumCapacity);
}
@Override
public synchronized void trimToSize() {
super.trimToSize();
}

?区别二:动态数组相关

  • String 不可动态扩容;
  • StringBuilder和StringBuffer可以动态扩容。

?String底层使用的是final修饰的常量数组所以其大小是不可变的。

private final char value[];

?StringBuilder和StringBuffer是可变的
原因:因为StringBuilder和StringBuffer都是继承了抽象类AbstractStringBuilder
AbstractStringBuilder内部使用的是字符数组非常量,也就是可变的。

char[] value;

初始化的时候默认的长度为16。

StringBuilder和StringBuffer还有一个区别:StringBuffer比StringBuilder多了一个toStringCache字段。
toStringCache:在字符串tostring之后,保存执行tostring() 方法之后的结果,当字符串改变的时候toStringCache就失效。

?拓展:单线程下的StringBuilder

相比于StringBuilder,StringBuffer在单线程的情况下也是加锁的,所以锁的添加与释放都需要耗费一定的时间。
由于Synchronized锁的优化,其锁的状态有偏向锁,轻量级锁,重量级锁,单线程状态下一直是一个线程持有该锁,所以一直是偏向锁,这样的话锁的添加与释放就减少了一定的时间耗费。

?总结

发表评论

相关文章