这是源码中2个类的声明
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
可以看出StringBuffer与StringBuilder都继承自AbstractStringBuilder,他们的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,是线程安全的,而 StringBuilder是线程不安全的。
使用他们是为了提高Java中字符串连接的效率,因为直接使用+进行字符串连接的话,Jvm会创建多个String对象,造成一定的开销。
StringBuffer 始于 JDK 1.0
StringBuilder 始于 JDK 1.5
从 JDK 1.5 开始,带有字符串变量的连接操作(+),JVM 内部采用的是 StringBuilder 来实现的,而之前这个操作是采用 StringBuffer 实现的。
这是AbstractStringBuilder的源码的字段声明部分
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
这是扩容的源码
/**
* This implements the expansion semantics of ensureCapacity with no
* size check or synchronization.
*/
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);
}
AbstractStringBuilder中采用一个char数组来保存需要append的字符串,当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展。即重新申请一段更大的内存空间,然后将当前char数组拷贝到新的数组中。
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
可以看出StringBuffer与StringBuilder都继承自AbstractStringBuilder,他们的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,是线程安全的,而 StringBuilder是线程不安全的。
使用他们是为了提高Java中字符串连接的效率,因为直接使用+进行字符串连接的话,Jvm会创建多个String对象,造成一定的开销。
StringBuffer 始于 JDK 1.0
StringBuilder 始于 JDK 1.5
从 JDK 1.5 开始,带有字符串变量的连接操作(+),JVM 内部采用的是 StringBuilder 来实现的,而之前这个操作是采用 StringBuffer 实现的。
这是AbstractStringBuilder的源码的字段声明部分
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
这是扩容的源码
/**
* This implements the expansion semantics of ensureCapacity with no
* size check or synchronization.
*/
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);
}
AbstractStringBuilder中采用一个char数组来保存需要append的字符串,当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展。即重新申请一段更大的内存空间,然后将当前char数组拷贝到新的数组中。