0%
Theme NexT works best with JavaScript enabled
StringBuffer结构解析
我们查看以下的结果,可以看出StringBuffer的父类以及相应的接口,表示该对象可以进行串行化以及可以用来比较
我们查看StringBuffer的父类AbstractStringBuilder,可以看到源码中存在着byte[] value,而且不是final类型,而该value数组存放着我们的字符串内容,因此可以了解到该字符存放在堆中,并不是存放在常量池中 ,所以对比前面学到的String,String保存的是字符串常量,里面的值并不能更改,每次更改需要改变地址。而StringBuffer保存的是字符串变量,里面的值可以更改,每一次更新实际可以更新内容,不用每一次更新地址(到我们的地址指向的空间不够时,地址才会改变),效率比较高。
StringBuffer是一个final类,并不能被继承
StringBuffer的转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public StringBuffer () { super (16 ); } StringBuffer stringBuffer = new StringBuffer (); public StringBuffer (int capacity) { super (capacity); } StringBuffer stringBuffer = new StringBuffer (100 ); public StringBuffer (String str) { super (str); } StringBuffer stringBuffer = new StringBuffer ("ascvcacv" ); public StringBuffer (CharSequence seq) { super (seq); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package Learn;import java.util.Arrays;import java.util.Locale;public class Test { public static void main (String[] args) { String str="hello" ; StringBuffer stringBuffer1=new StringBuffer (str); StringBuffer stringBuffer2=stringBuffer1.append(str); StringBuffer stringBuffer=new StringBuffer ("java" ); String str1=stringBuffer.toString(); String str2=new String (stringBuffer); } }
StringBuffer的常见方法
方法名
用法
append
增
delete
删
replace
改
indexOf
查
insert
插入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package Learn;public class Test { public static void main (String[] args) { StringBuffer stringBuffer=new StringBuffer ("java" ); stringBuffer.append("ee" ); System.out.println(stringBuffer); stringBuffer.delete(4 ,6 ); System.out.println(stringBuffer); stringBuffer.replace(0 ,1 ,"ha" ); System.out.println(stringBuffer); System.out.println(stringBuffer.indexOf("v" )); stringBuffer.insert(1 ,"ha" ); System.out.println(stringBuffer); } }
练习:
一步一步调试,追溯源码,可以看出最终两个的差别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package Learn;public class Test { public static void main (String[] args) { String str=null ; StringBuffer stringBuffer=new StringBuffer (); stringBuffer.append(str); System.out.println(stringBuffer.length()); System.out.println(stringBuffer); StringBuffer stringBuffer1=new StringBuffer (str); System.out.println(stringBuffer1.length()); } }
学会利用StringBuffer格式化输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package Learn;import java.util.Scanner;public class Test { public static void main (String[] args) { Scanner scanner=new Scanner (System.in); String name=scanner.next(); String price=scanner.nextDouble()+"" ; StringBuffer price1=new StringBuffer (price); int i=price1.lastIndexOf("." ); while (i>=3 ){ price1.insert(i-3 ,"," ); i=i-3 ; } System.out.println(price1); } }
StringBuilder结构剖析
StringBuilder是一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但是不保证同步(StringBuilder不是线程安全的,所有的方法都没有做互斥处理)。该类被设计用作StringBuffer的一个简易的替换,用在字符串缓冲区被单个线程使用时候,可以优先采用此类,大多数线程中比StringBuffer快
下面的图表明StringBuilder与StringBuffer继承了相同的类与接口,StringBuilder也是final的,不可以被继承
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 27 package Learn;import java.util.Scanner;public class Test { public static void main (String[] args) { StringBuffer stringBuffer=new StringBuffer ("花花" ); long startTime=System.currentTimeMillis(); for (int i=0 ;i<2000 ;i++){ stringBuffer=stringBuffer.append("haha" ); } long endTime=System.currentTimeMillis(); long totalTime=endTime-startTime; System.out.println("时间为" +totalTime); StringBuilder stringBuilder=new StringBuilder ("花花" ); startTime=System.currentTimeMillis(); for (int i=0 ;i<2000 ;i++){ stringBuilder=stringBuilder.append("haha" ); } endTime=System.currentTimeMillis(); totalTime=endTime-startTime; System.out.println("时间为" +totalTime); } }
String,StringBuffer与StringBuilder比较
StringBuffer与StringBuilder非常类似,均可以表示可变的字符序列,方法也一样
String不可变的字符序列,效率低,复用性高,如果我们对String做大量的修改,不要使用String
StringBuffer可变的字符序列,效率比较高,线程安全
StringBuilder可变,效率最高,线程不安全