往期推荐
synchronized如何实现可重入,和Lock区别-优快云博客
Mysql索引失效的几种场景、回表、索引覆盖、索引下推-优快云博客
StringBuffer和StringBuilder
两者都是继承自AbstractStringBuilder,在AbstractStringBuilder中使用了byte[ ]实现(jdk8之前由char[ ]实现),这里的byte[]没有使用final修饰,所以是可变的,
StringBuffer
对方法加了同步锁或者对调用的方法加了同步锁,线程安全。StringBuilder没加锁,不安全。
StringBuffer
每次都会对StringBuffer
对象本身进行操作,而不是生成新的对象并改变对象引用,相比StringBuilder性能不高。
字符串拼接
Java 语言本身并不支持运算符重载,“+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的运算符。
在"abc"+"abc"时,实际是通过
StringBuilder
调用append()
方法实现的,拼接完成之后调用toString()
得到一个String
对象 ,但是在循环内使用“+”进行字符串的拼接的话,存在比较明显的缺陷:编译器不会创建单个StringBuilder
以复用,而是每循环一次就创建过一个StringBuilder
对象。而如果直接使用StringBuilder
对象进行字符串拼接的话,就不会存在这个问题了。