现在我们继续来学习
StringBuffer和StringBuilder,之所以把他们放在一起,是因为他们有很多共性,没有必要分开来学习。他们都属于String的衍生物,他们和String最大的区别在于不是字符串常量。
我们都知道当新建一个String对象的时候,会创建一个字符串常量,并且这个对象是不可修改的,在进行一些操作时容易造成内存泄漏,StringBuilder的出现解决了这个问题。下面我们先来看看StringBuilder。
继承了AbstractStringBuilder和String相比少了Comparable接口,这意味着没有他没有compareTo方法。1
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
下面看一下构造方法,咱们只看一个有代表性的1
2
3
4
5
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}
本质上都是利用了super.append()方法,源码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34@Override
public AbstractStringBuilder append(CharSequence s) {
if (s == null)
return appendNull();
if (s instanceof String)
return this.append((String)s);
if (s instanceof AbstractStringBuilder)
return this.append((AbstractStringBuilder)s);
return this.append(s, 0, s.length());
}
//instanceof String
//没什么特别的地方,简单易懂,因为AbstractStringBuilder也实现了CharSequence所以迁移起来非常方便
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
//instanceof AbstractStringBuilder
AbstractStringBuilder append(AbstractStringBuilder asb) {
if (asb == null)
return appendNull();
int len = asb.length();
ensureCapacityInternal(count + len);
asb.getChars(0, len, value, count);
count += len;
return this;
}
It’s over.真的没什么东西可说了,和String对比看一下马上就明白了。无非就是多了insert()方法。
StringBuffer和StringBuilder几乎一样!!!
有一点区别,StringBuilder是线程安全的,看一看到凡是涉及到对象操作的时候StringBuffer都是下面这个画风:1
2
3
4
5
6
public synchronized void getChars(int srcBegin, int srcEnd, char[] dst,
int dstBegin)
{
super.getChars(srcBegin, srcEnd, dst, dstBegin);
}
利用synchronized来实现方发锁,实现线程安全,几乎所有参数为StringBuffer的方法都会加上这个关键字。对于这个关键字的使用,我的另一篇博文中有过讲解。
好的,就到这了,本文浅尝辄止,想要深入研究的小伙伴要自己努力了!
另外,强烈建议自己分别用String,StringBuffer和StringBuilder创建对象,看看有什么不同,注意对比地址和哈希码,很快就能掌握了~