Java自学笔记—StringBuffer
特点
可变字符序列
直接父类AbstractStringBuilder,有char[] value;不是final
value数组存放字符串,不是final,因此存在堆中
实现了Serializable 接口,可以串行化
String中value指向常量池,为final类型,每次更新内容都要更新地址,即创建新对象
Stringbuffer中value指向堆,没有final修饰,不用每次更新地址(有缓冲扩容机制),效率高
构造器
空参构造器默认有16个字符的缓冲区
/**
* @author Lspero
* @version 1.0
*/
public class Stringbuffer012 {
public static void main(String[] args) {
//构造器
//无参构造器,创建一个大小为16的char[ ]
StringBuffer stringBuffer = new StringBuffer();
// 自定义char[]的大小
StringBuffer stringBuffer1 = new StringBuffer(128);
//利用一个String创建StringBuffer,char[]大小为String.length() + 16
StringBuffer hello = new StringBuffer("hello");
}
}
常用方法
添加append()
删除delete(a,b)
替换replace(a, b, str)
查找indexOf
插入insert(a, str)
/**
* @author Lspero
* @version 1.0
*/
public class StringbufferMethod01 {
public static void main(String[] args) {
// 添加append()
// 若String = null; 即为空时,调用父类AbstractStringBuilder.appendNULL(),直接添加"null";
StringBuffer s = new StringBuffer("hello");
s.append(2).append("hello").append(true);
System.out.println(s);// hello2hellotrue
// 删除delete(a,b) 左闭右开
s.delete(0,5);
System.out.println(s);// 2hellotrue
// 替换replace(a, b, str) 左闭右开
s.replace(0, 6,"world");
System.out.println(s);// worldtrue
// 查找indexOf
int index = s.indexOf("true");
System.out.println(index);// 5
// 插入insert(a, str),索引a后朝后移
s.insert(5, "hello");
System.out.println(s);// worldhellotrue
//长度length()
System.out.println(s.length());// 14
}
}
StringBuffer 与 String 之间转换
/**
* @author Lspero
* @version 1.0
*/
public class StringAndStringBuffer {
public static void main(String[] args) {
//String -> StringBuffer
String str = "heelo tom";
StringBuffer stringBuffer = new StringBuffer(str);
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1 = stringBuffer1.append(str);
//StringBuffer -> String
StringBuffer lspero = new StringBuffer("lspero");
String s = lspero.toString();
String s1 = new String(lspero);
}
}
String StringBuffer StringBuilder区别
- String中value指向常量池,为final类型,每次更新内容都要更新地址,即创建新对象,StringBuffer和StringBuilder 中的value属性存在堆中没有final修饰,不用每次更新地址(有缓冲扩容机制),效率高
- StringBuilder线程不安全,没有做互斥处理,synchronized关键字,效率最高
- tring效率低但复用率高,如果堆字符串做大量修改,不要用String
总结
- Stringbuffer中value指向堆,没有final修饰,不用每次更新地址
- 空参构造器默认有16字符缓冲区
- 使用添加append()方法,若String = null; 即为空时,调用父类AbstractStringBuilder.appendNULL(),直接添加"null";
- 少量字符处理,如ID、地址之类用String 大量字符处理单线程用StringBuilder 大量字符处理多线程用StringBuffer