StringBuffer
结合【JDK源码阅读之StringBuilder】更香。
和StringBuilder不同,StringBuffer是线程安全的。正如源码头一句的介绍所示:A thread-safe, mutable sequence of characters.StringBuffer和String,StringBuilder一样,都是不可以被继承的,同时使用字符数组存储字符。
构造方法
public StringBuffer() {
super(16);
}
public StringBuffer(int capacity) {
super(capacity);
}
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
和StringBuilder类中的构造方法一样,默认的空间为16。
length()
public synchronized int length() {
return count;
}
获取StringBuffer中字符串的长度。需要注意的是在StringBuffer中这个方法是线程安全的。查看源码我们会发现所有的方法都是线程安全的。但是,线程安全会带来效率问题,所有StringBuilder的效率比StringBuffer的效率更高。
capacity()
获取StringBuffer的容量,与字符串的长度没有关系。
StringBuffer buffer = new StringBuffer(20);
buffer.append("hello");
System.out.println(buffer.length());//5
System.out.println(buffer.capacity());//20
toString()
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
private transient char[] toStringCache;
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
和StringBuilder直接返回一个字符串不同的是使用了toStringCache构造字符串。toStringCache是一个字符数组,这个变量是用于最近一次toString()方法的缓存,任何时候只要StringBuffer被修改了这个变量会被赋值为null,相关操作可以在append()、setLength()等方法中发现。所有在toString这个方法中,如果toStringCache
为null则先缓存。
版权属于:带翅膀的猫
本文链接:https://www.chengpengper.cn/archives/29/
转载时须注明出处及本声明
你的才华让人瞩目,期待你的更多文章。 http://www.55baobei.com/wY3BMrOBrD.html