标签:
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