StringBuffer & StringBuilder源码解析


现在我们继续来学习StringBufferStringBuilder,之所以把他们放在一起,是因为他们有很多共性,没有必要分开来学习。他们都属于String的衍生物,他们和String最大的区别在于不是字符串常量。

我们都知道当新建一个String对象的时候,会创建一个字符串常量,并且这个对象是不可修改的,在进行一些操作时容易造成内存泄漏,StringBuilder的出现解决了这个问题。下面我们先来看看StringBuilder

继承了AbstractStringBuilderString相比少了Comparable接口,这意味着没有他没有compareTo方法。

1
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence

下面看一下构造方法,咱们只看一个有代表性的

1
2
3
4
5
@Override
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()方法。

StringBufferStringBuilder几乎一样!!!

一点区别,StringBuilder是线程安全的,看一看到凡是涉及到对象操作的时候StringBuffer都是下面这个画风:

1
2
3
4
5
6
@Override
public synchronized void getChars(int srcBegin, int srcEnd, char[] dst,
int dstBegin)
{
super.getChars(srcBegin, srcEnd, dst, dstBegin);
}

利用synchronized来实现方发锁,实现线程安全,几乎所有参数为StringBuffer的方法都会加上这个关键字。对于这个关键字的使用,我的另一篇博文中有过讲解。

好的,就到这了,本文浅尝辄止,想要深入研究的小伙伴要自己努力了!

另外,强烈建议自己分别用String,StringBuffer和StringBuilder创建对象,看看有什么不同,注意对比地址和哈希码,很快就能掌握了~

-------------本文结束,感谢您的阅读-------------

本文标题:StringBuffer & StringBuilder源码解析

文章作者:饭饭君~

发布时间:2018年12月03日 - 16:54

最后更新:2019年04月23日 - 10:50

原始链接:https://yangcf.github.io/2018/12/03/StringBuffer&StringBuilder源码解析/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

如果我的文章有帮助到你,欢迎打赏~~
0%