String/StringBuilder/StringBuffer区别
String/StringBuilder/StringBuffer区别
String
1 | /* |
首先String是一个final修饰不可继承的类,内部使用final修饰的char[]来保存数据,String是不可变的
1 | String str = "123"; |
每次对String拼接都会创建一个新String对象
AbstractStringBuilder
AbstractStringBuilder是一个抽象类,是StringBuilder和StringBuffer的父类,二者大部分操作都是基于此类实现的
1 | /* |
AbstractStringBuilder是一个可变的字符串类,内部使用char[]来保存数据,count用来记录value已用长度。
每次append操作都会向value中添加数据,若数组容量不够则进行扩容,扩容后容量是原容量的2倍
append操作并不会创建新对象,而是在原有对象上进行修改,所以AbstractStringBuilder是可变的
1 | StringBuilder bd = new StringBuilder("123"); |
StringBuilder
StringBuilder继承AbstractStringBuilder类所有方法均调用父类实现
StringBuffer
StringBuffer继承AbstractStringBuilder类所有方法均调用父类实现
所有方法均使用synchronized关键字修饰,所以StringBuffer是线程安全的
结语
实际上在编译期优化了的string+操作的运行效率并非低于使用其他两个类
因为许多编译器会将此操作优化为builder.append的形式
理论上执行效率 StringBuilder > StringBuffer > String