StringBuffer和StringBuilder
一、StringBuffer、StringBuilder、String三者的异同。
1、String:不可变的字符序列;底层使用char[ ]存储;
2、StringBuffer:可变字符序列;线程安全,效率低。底层使用char[ ]存储;
3、StringBuilder:可变字符序列;线程不安全,效率高,JDK5.0新增;底层使用char[ ]存储;
二、源码分析
1、String:
String str = new String( ); 底层为char[ ] value = new char[ 0 ] ;
String str = new String( "abc"); 底层为char[ ] value = new char[ ]{ 'a','b','c' };
2、StringBuffer:
StringBuffer sb1 = new StringBuffer ();底层会创建一个长度为16的char型数组;char[ ] value = new char[16];
此时sout(sb1.length())会输出0;
sb1.append( 'a' );底层value[ 0 ] = 'a';
sb1.append( 'b' );底层value[ 1 ] = 'b';
StringBuffer sb2 = new StringBuffer ( 'abc' );底层会创建一个长度为'abc'.length() + 16的char型数组;char[ ] value = new char['abc'.length + 16];
注意:此时打印sb2的长度,会是3。
3、StringBuffer和StringBuilder的扩容问题
默认情况下,扩容为原来容量的2倍 + 2,同时将原有数组中的元素复制到新的数组中。
三、StringBuffer和StringBuilder常用方法
1、append(“xxx”);拼接字符串。
2、delete(int start ,int end);删除指定位置的内容。
3、replace(int start ,int end , String str)把[ start,end )位置替换为str。
4、insert(int offset,xxx)在指定位置插入xxx。
5、reverse()把当前字符串序列逆转。
6、indexOf( String str ) 返回指定字符串在调用该方法的字符串中首次出现的位置。
7、substring( int start, int end ) 返回 [start,end )索引之间的子字符串。
8、length( )返回字符串长度。
9、charAt( int n) 返回索引n对应的字符。返回值为char类型。
10、setCharAt( int n , char ch ) 把索引n位置上的字符替换为ch。
四、StringBuffer StringBuilder String 三者之间效率比较。
效率从高到低:StringBulider > StringBuffer > String