1.StringBuffer和StringBuilder
从类图中我们可以发现:
String和StringBuffer(或StringBuilder)并没有直接的继承关系
StringBuffer和StringBuilder都是继承自AbstractStringBuilder,实现了Serializable接口,可以序列化。
AbstractStringBuilder实现了Appendable和CharSequence接口,提供了append、charAt、subSequence等操作。
2.StringBuffer比StringBuilder成员变量
StringBuffer和StringBuilder成员变量基本上都是继承自AbstractStringBuilder的,但是多了一个序列化ID,StringBuffer还有一个toStringCache数组,用来缓存上一次toString的值,如果进行了修改方法,将会使这个值置空。
3.insert、replace、delete、append等
这些操作基本上都是通过System类的arraycopy方法来实现。System.arraycopy是一个native方法,在一定程度上提高了效率。
详细怎么实现的就不多介绍,比较简单。
4.String、StringBuffer和StringBuilder
-
StringBuffer中的大部分方法都是用synchronized方法进行了修饰,所以StringBuffer是线程安全,但是使用synchronized,每次都会要进行加锁和释放锁的操作,会有额外的开销,所以性能上StringBuffer会比StringBuilder要低。
-
String类是一个不可变类,对String类进行修改每次都会返回一个新的对象。所以String类每次调用修改的方法需要重新进行引用。StringBuffer和StringBuilder就是直接在对象本身进行操作,不会产生新的对象,所以性能上会由于String。
-
由于String对象每次都会新生成一个对象,所以在频繁的做字符串拼接的时候,用String类会产生大量的字符串,很容导致GC,所以做字符串拼接建议使用StringBuffer或者StringBuilder
小结:字符串修改时的速度:String<StringBuffer<StringBuilder
网友评论