Java常用类:StringBuilder
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java常用类:StringBuilder,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3403字,纯文字阅读大概需要5分钟。
内容图文
一、介绍
StringBuilder是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串 缓冲区 被单个 线程 使用的时候(这种情况很普遍)StringBuilder类可以用于在无需创建一个新的字符串对象情况下修改字符串。StringBuilder不是线程安全的,而StringBuffer是线程安全的。但StringBuilder在单线程中的性能比StringBuffer高。StringBuilder类来源于jdk1.5及以后的版本
常用方法:
1、append(); //追加到末尾
2、insert(int offset,String str) ; //在指定的索引处插入字符串
3、delete(int startIndex,int endIndex) //删除区域索引[startIndex,endIndex)的字符
4、reverse() //反转
StringBuilder的孪生兄弟StringBuffer,因为它们有一个相同的父类AbstractStringBuilder
二、源码解析
1
2
3
4
5
|
//同样,StringBuilder也是final修饰的不可变,相比String来说,继承了AbstractStringBuilder,StringBuffer也是同样继承了该类
public
final
class
StringBuilder
extends
AbstractStringBuilder
implements
java.io.Serializable, CharSequence
{
|
AbstractStringBuilder类是一个抽象类,有两个子类:StringBuffer和StringBuilder
AbstractStringBuilder类中有两个属性,分别是
char
value[];
//值、
int
count;
//长度。
所以
,StringBuilder里是直接可以用的。
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
|
public
StringBuilder() {
super
(
16
);
//默认创建了一个长度为16的char数组
}
public
StringBuilder(
int
capacity) {
super
(capacity);
//也可以自定义长度
}
public
StringBuilder(String str) {
super
(str.length() +
16
);
//调用父类构造器:并且在原来的16上再加上传来str的长度
append(str);
//然后再追加
}
//看看append方法
public
StringBuilder append(String str) {
super
.append(str);
//调用了父类的append方法。
return
this
;
}
public
AbstractStringBuilder append(String str) {
if
(str ==
null
) str =
"null"
;
int
len = str.length();
if
(len ==
0
)
return
this
;
int
newCount = count + len;
if
(newCount > value.length)
expandCapacity(newCount);
str.getChars(
0
, len, value, count);
//从0开始,到当前数组长度,进行拷贝
count = newCount;
return
this
;
}
|
StringBuilder重载了很多append方法
查看源码发现,所有的append方法里最后都有一句return this,有什么作用呢?
1
2
3
4
5
6
7
8
9
10
11
12
|
//StringBuilder的创建
StringBuilder sb =
new
StringBuilder();
//数组长度初始为16
StringBuilder sb2 =
new
StringBuilder(
32
);
//长度直接为32
StringBuilder sb3 =
new
StringBuilder(
"abc"
);
//1、初始化长度为16+abc的长度=19 2、把a,b,c放到长度为19的value数组里value={‘a‘,‘b‘,‘c‘,‘\u0000‘,‘\u0000‘,‘\u0000‘.....}
//StringBuilder的append
sb.append(
"a"
).append(
"b"
).append(
"c"
);
//源码中return this的作用(方法链)
/**
* 上述
* sb.append("a")追加完了后,最后return this,也就还是sb对象。
* sb.append("a").append("b") 也就等于sb.append("b") 最后还是return this
* sb.append("a").append("b").append("c") 也就等于sb.append("c") 最后还是return this
*/
|
return this 的作用就是使调用成一个方法链,可以一直调用append。
三、总结
1、StringBuilder和StringBuffer都是继承了AbstractStringBuilder这个抽象类
2、StringBuilder同样是final修饰的,不可改变。跟String很多类似的地方
3、StringBuilder线程不安全,单线程效率高(比较常用)
4、StringBuilder创建对象个数问题:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
StringBuilder sb4 =
new
StringBuilder(
"abc"
);
//这里两个对象,一个abc,一个new StringBuilder
for
(
int
i =
0
; i <
10
; i++) {
sb4.append(i);
//这里从始至终还是sb4一个对象
}
//以上代码块,总共2个对象
//这里有个问题,既然内部是用数组实现的。并且长度也是指定的了。那么每次append不就增加一个了吗?
//那这个长度是怎么加上的呢,这就得说内部的容量扩容了,继续查看源码,源码中有一句关键代码:
if
(spaceNeeded > value.length)
//如果大于数组长度
expandCapacity(spaceNeeded);
//则,扩容
//expandCapacity方法
void
expandCapacity(
int
minimumCapacity) {
int
newCapacity = (value.length +
1
) *
2
;
//1,计算新容量:在原来的基础上+1然后乘2
if
(newCapacity <
0
) {
newCapacity = Integer.MAX_VALUE;
}
else
if
(minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
//2,重新复制出一个新数组,新数组的长度就是刚计算的长度。然后将原来的value变量指向到新数组。
//原来的老数组value没有被引用了,就会被垃圾回收
value = Arrays.copyOf(value, newCapacity);
}
|
原文:http://www.cnblogs.com/meet/p/4696543.html
内容总结
以上是互联网集市为您收集整理的Java常用类:StringBuilder全部内容,希望文章能够帮你解决Java常用类:StringBuilder所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。