Java基础(40)String、StringBuilder和StringBuffer的区别(TODO)
一、String
String实现了Serializable接口、Comparable<String>接口和CharSequence接口,并且使用final char value[]不可变字符数组保存字符串。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];
...
}
二、AbstractStringBuilder
AbstractStringBuilder抽象类实现了Appendable接口、CharSequence接口,并且使用char[] value数组保存字符串。
abstract class AbstractStringBuilder implements Appendable, CharSequence { * The value is used for character storage. char[] value;
}
三、StringBuilder
StringBuilder继承了AbstractStringBuilder抽象类并且实现了Serializable接口、CharSequence接口。
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{}
四、StringBuffer
StringBuffer也继承了AbstractStringBuilder抽象类并且实现了Serializable接口、CharSequence接口
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{}
五、区别
1.可变性
String不可变,因为是用final字符数组保存字符串,而StringBuilder和StringBuffer可变,因为是用普通字符数组保存字符串
2.线程安全性
StringBuilder和StringBuffer都继承了AbstractStringBuilder的方法,例如
AbstractStringBuilder中的方法是:
public int indexOf(String str, int fromIndex) { return String.indexOf(value, 0, count, str, fromIndex); }
而StringBuilder中同样的方法表示为:
@Override public int indexOf(String str, int fromIndex) { return super.indexOf(str, fromIndex); }
而StringBuffer中同样的方法表示为:
@Override public synchronized int indexOf(String str, int fromIndex) { return super.indexOf(str, fromIndex); }
synchronized关键字修饰实例方法是作用于当前实例加锁,进入同步代码前要获得当前实例的锁。
因此,StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
3.速度比较