码迷,mamicode.com
首页 > 编程语言 > 详细

Java常用类:StringBuilder

时间:2015-08-02 20:01:26      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

一、介绍

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").append("b").append("c")代码解析:
 * 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);
}








Java常用类:StringBuilder

标签:

原文地址:http://www.cnblogs.com/meet/p/4696543.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!