标签:
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();//数组长度初始为16StringBuilder sb2 = new StringBuilder(32);//长度直接为32StringBuilder sb3 = new StringBuilder("abc");//1、初始化长度为16+abc的长度=19 2、把a,b,c放到长度为19的value数组里value={‘a‘,‘b‘,‘c‘,‘\u0000‘,‘\u0000‘,‘\u0000‘.....}//StringBuilder的appendsb.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 StringBuilderfor (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