String
String是不可变的字符串,其具体定义如下:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
private int hash; // Default to 0
private static final long serialVersionUID = -6849794470754667710L;
}
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;
}
StringBuilder
public final class StringBuilder
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
static final long serialVersionUID = 4383685877147921099L;
public StringBuilder() {
super(16);
}
public StringBuilder(int capacity) {
super(capacity);
}
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
}
StringBuffer
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
private transient char[] toStringCache;
static final long serialVersionUID = 3388685877147921107L;
public StringBuffer() {
super(16);
}
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
}
第一、StringBuilder和StringBuffer都是继承自AbstractStringBuilder
第二、通过查看AbstractStringBuilder的定义我们可以看出StringBuilder和StringBuffer都是可以长度可变的字符串。
第三、StringBuffer是线程安全的,在各种操作时候,都是用synchronized关键字进行加锁操作,保证只有一个线程对其的操作;而StringBuilder并没有进行加锁。
由此可以得出如下是用场景:
- 基本原则:如果要操作少量的数据,用String;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。
- 不要使用String类的”+”来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,
- StringBuilder一般使用在方法内部来完成类似”+”功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中