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

 

      

posted @ 2021-05-17 22:07  早春的树  阅读(88)  评论(0编辑  收藏  举报