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,StringBuffer在单线程的情况下也是加锁的,所以锁的添加与释放都需要耗费一定的时间。
由于Synchronized锁的优化,其锁的状态有偏向锁,轻量级锁,重量级锁,单线程状态下一直是一个线程持有该锁,所以一直是偏向锁,这样的话锁的添加与释放就减少了一定的时间耗费。
以上就是关于String,StringBuilder,StringBuffer区别,希望有所帮助。
- 点赞
- 收藏
- 关注作者
评论(0)