前言:
StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder。
StringBuffer和StringBuilder是系统的类,两者和字符串的区别都是可变的字符序列.
但是不同的是StringBuffer是线程安全的,比较消耗资源的类,StringBuilder是线程不安全,节省资源的类 ,下面就来整理一下两者的详细区别。
两者的优势及缺陷:
1. 存储数据的字符数组没有被final修饰,说明值可以改变,抽象类AbstractStringBuilder内部都提供了一个自动扩容机制,当发现长度不够的时候(初始默认长度是16),会自动进行扩容工作,扩展为原数组长度的2倍加2,创建一个新的数组,并将数组的数据复制到新数组,所以对于拼接字符串效率要比String要高。
2. 线程安全性:StringBuffer由于很多方法都被 synchronized(加锁) 修饰了所以线程安全,但是当多线程访问时,加锁和释放锁的过程很频繁,所以效率相比StringBuilder要低。
3. StringBuilder相反执行效率高,但是线程不安全。
执行速度: StringBuilder > StringBuffer > String。
StringBuffer与StringBuild的源码:
StringBuffer的构造方法:
StringBuild的构造方法:
线程安全:
StringBuffer:
StringBuild:
总结:
可以看出两者的方法中StringBuffer全部加了"synchronized"修饰这就使得StringBuffer的线程安全,但是平凡的加锁和释放锁导致性能降低,执行速度上比StringBuffer要慢。
而 StringBuild则全都没有用"synchronized"修饰,因此线程不安全,但是由于没有加锁和释放锁的过程,执行速度上比StringBuffer要快。
例子:
拼接字符串:
编码: