2020春招Java面试题型汇总《1》( 二 )

StringBuffer和StringBuilder都继承AbstractStringBuilder类 , 在AbstractStringBuilder中也是使用字符数组来保存字符串 char[
value , 但是没有用final关键字修饰 , 所以两种对象是可变的 。

线程安全性

String中的对象是不可变的 , 因此也可以理解成线程安全的 。

AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类 , 定义了一些字符串的基本操作 , 如 expandCapacity、append、insert、indexOf 等公共方法 。 StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁 , 所以是线程安全的 。 StringBuilder 并没有对方法进行加同步锁 , 所以是非线程安全的 。

(引申一道题:i++是线程安全的吗?=============>线程不安全)

性能

每次对String类型进行改变的时候 , 都会生成一个新的String对象 , 然后将指针指向新的String对象 , 这个过程中会重新开辟内存空间 , 对内存空间极大的浪费 。

推荐阅读