StringBuilder源码分析
#StringBuilder源码分析
作者
概况
一个可变的字符序列。此类提供一个与 StringBuffer
兼容的 API
,但不保证同步。该类被设计用作 StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer
要快。
签名
|
|
可以看到StringBuilder继承了
- Serializable:可以序列化的标志。
- CharSequence接口:包含了charAt()、length() 、subSequence()、toString()这几个方法,String类也实现了这个接口。
- 抽象类AbstractStringBuilder,这个类封装了StringBuilder和StringBuffer大部分操作的实现
CharSequence接口
这个接口是代表一个有序字符集合,使用该接口的方法一共有四个:CharBuffer
、String
、StringBuffer
、StringBuilder
。
AbstractStringBuilder类
变量及构造方法
|
|
AbstractStringBuilder内部用一个char[]数组保存字符串,可以在构造的时候指定初始容量方法。
append()方法
|
|
append()方法用于追加字符,如果str是null,则会调用appendNull()方法。这个方法其实是追加了’n’、‘u’、’l’、’l’这几个字符。如果不是null,则首先扩容,然后调用String的getChars()方法将str追加到value末尾。最后返回对象本身,所以append()可以连续调用。
Stringbuilder构造器
StringBuilder()
这个构造器的作用是构造一个初始化不带参数的,初始化字节为16
字节。
StringBuilder(int)
构造一个其中不带字符的字符串生成器,初始容量由传入的 int
值指定。
StringBuilder(String)
构造一个字符串生成器,并初始化为指定的字符串内容。该字符串生成器的初始容量为 16 加上字符串参数的长度。
|
|
如果传入的字符串问 null
则会抛出空指针 NullPointerException
异常。
示例代码
|
|
输出结果
Exception in thread “main” java.lang.NullPointerException at java.lang.StringBuilder.
(StringBuilder.java:112) at StringBuilderApi.main(StringBuilderApi.java:7) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
StringBulider(CharSequence)
构造一个字符串生成器,包含与指定的 CharSequence
相同的字符。该字符串生成器的初始容量为 16
加上 CharSequence
参数的长度。
append()方法
该方法一共用13个重载函数,用于实现不同的数据类型。Object
,String
,StringBuffer
,CharSequence
,char[]
,boolen
,int
,long
,float
,double
等,但是他们的作用是一直的。那就是将参数添加到字符串中。
|
|
Stringbulider的appen()方法显然直接调用的父类AbstractStringBuilder中的该方法。
appendCodePoint()方法
该方法是附加一个Uncode字符在字符串末尾。
|
|
delete()方法
该方法是删除所字符串中的字符,所传入的参数为其实点和结束点。直接使用父类(AbstractStringBuilder
)的方法
|
|
toString()方法
toString()方法返回了一个新的String对象,与原来的对象不共享内存。
|
|
replace()方法
replace
方法仍旧继承了父类的 replace
方法,是替换字符
|
|
insert()方法
该方法是插入字符串。该方法重载了12个方法。
总结
该类所有的方法都是通过父类( AbstractStringBuilder
)来实现。该方法与String
和StringBuffer
的区别在于,String
是不可修改的,StringBuffer
和StringBuilder
是可以修改的,但是StringBuffer
是线程安全的,StringBuilder
是线程不安全的,但是在效率上, StringBuffer
因为对方法做了同步,所以一般是低于 StringBuilder
的.