2.看下它的构造函数:
public StringBuffer() {
super(16);
}
无参数的构造函数是指定大小为16的可变字符串。
public StringBuffer(int capacity) {
super(capacity);
}
这个是指定大小的可变字符串。
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
这个是把字符串的大小设为str.length+16那么大的长度,并把字符串添加进去。
3.如果我们添加的内容大小没有超过字符串的size时,那么我们就可以把字符串直接添加进去,当我们的要添加的字符串长度大于可用的空间剩余大小,那么将调用
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
这个函数就把可变字符串的长度改为之前长度的2倍+2;
这里提下"+"方面的内容。
String str=hello“”;//1
str=str+"world";//2
上面的例子是在运行期间决定字符串"hello"和"world"的连接,根据String的内存分配原理,编译后的字节码等同于以下代码:
String str="hello";//3
StringBuffer temp=new StringBuffer();//4
temp.append(str);//5
temp.append("world");//6
String s=temp.toString();//7
因此,如下代码的执行效率将比前述例子更高。
StringBuffer sb=new StringBuffer();//8
sb.append("hello");//9
sb.append("world");//10
又如:
String s="hello"+"world";//11等同于:
String s="hello world";//12
由此可见:当使用第一条语句的时候,用"+"内存开销较大,因为要用重建一个Sting类的对象,然而我们在第11条使用"+"号在编译期间进行字符串连接,那么它比使用StringBuffer来做的效率更高。所以当我们的字符串需要频繁的增删改时,最好使用StringBuffer;当我们想编译时就把字符串确定的时候最好用String来定义,可以被其他对象共享,还有一点String类最好不要用new来创建,可以直接用String str="wang";这样建的好处是它直接就把它存在字符串缓冲池中,得以共享。String str=new String("wang")这种方式不推荐使用。