1、可变与不可变
string类中使用字符数组保存字符串 如下就是, 因为有‘final’修饰符 所以string对象是不可变的
private final char value[];
stringbuffer和stringbuilder都继承了abstractstringbuilder 类 ,在abstractstringbuilder中也是使用字符数组保存字符串,如下就是 可知这两个对象都是可变的。
char[] value;
2、线程安全
string对象是不可变的 可以理解为常量 因此线程安全
abstractstringbuilder 是stringbuilder和stringbuffer的公共父类 定义了一些字符串的基本操作 和一些公共方法
stringbuffer对方法加了同步锁 因此线程安全
stringbuilder没有对方法加同步锁 因此非线程安全
3、stringbuilder和stringbuffer的共同点
他俩有一个公共父类(抽象类)
抽象类与接口的唯一区别就是 抽象类可以定义一些子类共同的方法 子类只需要添加新的功能即可 不需要重写已经存在的方法
接口只是对方法的申明和常量的定义 。他俩都会调用抽象类中的方法如super.append
但stringbuffer在方法上加了synchronized关键字 进行同步
如果程序不是多线程 使用stringbuilder效率高于stringbuffer