StringBuffer
基本介绍
-
很多方法与String相同,但StringBuffer是可变长度的。StringBuffer是一个容器。
结构剖析
-
直接父类是 AbstractStringBuilder
-
Serializable接口表示String是串行化的,表示String类可以在网络上传输
-
CharSequence接口表示String类是一个有序字符集合
-
在父类中 AbstractStringBuilder 有属性char[] value ,不是final,该value数组存放字符串内容,存放在堆中,不用每次都更新地址
-
StringBuffer 是一个final类,不能被继承,
StringBuffer Vs String
-
String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低 //private final char value[]
-
StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用更新地址,效率较高//char [] value; // 这个放在堆,String是放在常量池中.
StringBuffer更新过程,只有当数组长度不够的时候,会创建新的数组,然后拷贝过去,再指向新的数组
StringBuffer构造器
//1.创建一个 大小为 16的 char[],用于存放字符内容
StringBuffer stringBUffer = new StringBuffer();
//2 通过构造器指定 char[]大小= new StringBuffer(100);
StringBuffer StringBuffer1 = new StringBuffer(100);
//3。通过 给一个String 创建 StringBuffer,char[]大小就是 str.length()+ 16
StringBuffer hello = new StringBuffer("hello");
StringBuffer和String相互转换
//看String --> StringBuffer
String str = "hello tom";
//方式1 使用构造器
//注意:返回的才是StringBuffer对象,对str没有影响
StringBuffer stringBuffer = new StringBuffer(str);
//方式2 使用的是append方法
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1 = stringBuffer1.append(str);
//看StringBuffer-->String
StringBuffer stringBuffer2 = new StringBuffer("hello tom");
//方式1,使用StringBuffer的toString方法
String s = stringBuffer2.toString();
//使用构造器
String s1 = new String(stringBuffer2);
StringBuffer常用方法
-
增 append // 传入null 会转成null字符串存入数组
-
删 delete(start,end)
-
改replace(start,end,string)//将start--end间的内容替换掉,不含end
-
查indexOf //如果子串在字符串第1次出现的索引,如果找不到返回-1
-
插insert
-
获取长度
练习
读源码
public class StringBufferExercise01 {
String str = null;// ok
StringBuffer sb = new StringBuffer(); //ok
sb.append(str);//需要看源码 , 底层调用的是 AbstractStringBuilder 的 appendNull
System.out.println(sb.length());//4
System.out.println(sb);//null
//下面的构造器,会抛出 NullpointerException
StringBuffer sb1 = new StringBuffer(str);//看底层源码 super(str.length() + 16);
System.out.println(sb1);
}