StringBuffer的特点:
1、线程安全的
不安全,就是存在同步操作同一数据的行为,效率高。
安全的时候,没有同步操作,效率低。
在实际开发中,效率和安全着两个问题一直都是很难平衡的问题。
生活中的例子:
线程安全的例子:银行的一些业务,电影院卖票,医院取号。
线程不安全的例子:视频会员,博客评论
2、线程安全的,StringBuffer是一个可变序列
3、StringBuffer又称之为字符串缓冲区,就把它当作一个字符串去操作,只不过它与String相比是可以修改内容的
4、在任何时间点,它包含着一些特定的字符序列,但是可以通过某些方法修改这字符序列的长度和内容
简单记忆:StringBuffer是一个线程安全的可变序列。
面试题:StringBuffer与String区别:
1、StringBuffer的长度和内容都可以发生改变,String却不行
2、String每创建一个新的字符串都会开辟一个新的常量池区域
StringBuffer会提前给出容量,可以进行字符串的拼接,而不会重新弄开辟空间
StringBuffer的构造方法:
public StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
public StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
public class StringBufferDemo1 {
public static void main(String[] args) {
//public StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
StringBuffer sb1 = new StringBuffer();
System.out.println("sb1:" + sb1); //StringBuffer重写了toString方法
//如何获取StringBuffer的容量
//public int capacity()返回当前容量。
System.out.println("当前StringBuffer的容量为:" + sb1.capacity());
//public int length()返回长度(字符数)。
System.out.println("StringBuffer中字符串的长度为:" + sb1.length());
System.out.println("===================================================");
//public StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
StringBuffer sb2 = new StringBuffer(50);
System.out.println("sb2:" + sb2); //StringBuffer重写了toString方法
//如何获取StringBuffer的容量
//public int capacity()返回当前容量。
System.out.println("当前StringBuffer的容量为:" + sb2.capacity());
//public int length()返回长度(字符数)。
System.out.println("StringBuffer中字符串的长度为:" + sb2.length());
System.out.println("===================================================");
//public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
StringBuffer sb3 = new StringBuffer("hello");
System.out.println("sb3:" + sb3); //StringBuffer重写了toString方法
//如何获取StringBuffer的容量
//public int capacity()返回当前容量。
System.out.println("当前StringBuffer的容量为:" + sb3.capacity()); // 21 = 16(初始值) + 5
//public int length()返回长度(字符数)。
System.out.println("StringBuffer中字符串的长度为:" + sb3.length()); // 5
}
}
StringBuffer的添加功能 public StringBuffer append(String str) 通过观察API发现,不光可以追加字符串,还可以是任意数据类型的追加到StringBuffer中 返回的StingBuffer是什么呢? public StringBuffer insert(int index,String str)下面是相应的例子:
public class StringBufferDemo2 {
public static void main(String[] args) {
//创建一个StringBuffer对象
StringBuffer sb = new StringBuffer();
//public StringBuffer append(String str)
StringBuffer stringBuffer = sb.append("hello");
System.out.println(stringBuffer);
System.out.println(sb);
System.out.println(sb == stringBuffer);
// sb.append(10);
// sb.append('a');
// sb.append(true);
// sb.append(12.34);
// //无论追加的数据是什么类型,
// 一旦进入到StringBuffer中就是成了字符串
// System.out.println(sb);
// System.out.println(stringBuffer);
//链式编程追加
sb.append(10).append('a').append(true).append(12.34);
System.out.println(sb);
System.out.println("===============================================");
//hello10atrue12.34
//public StringBuffer insert(int offset,String str)
// 将字符串插入到此字符序列中。返回的是字符串缓冲区本身
//String参数的String按顺序插入到指定偏移量的该序列中,向上移动原始位于该位置的任何字符,
// 并将该序列的长度增加到参数的长度。
sb.insert(5, "hadoop");
System.out.println(sb);//hellohadoop10atrue12.34
// 如果str是null ,则四个字符"null"被插入到该序列中。
// sb.insert(5,null);
Object o = null;
sb.insert(5, o);
System.out.println(sb);//hellonull10atrue12.34
}
}
remove,move,delete,drop,truncate StringBuffer的删除功能 public StringBuffer deleteCharAt(int index) 删除指定索引处的字符。该序列缩短了一个char public StringBuffer delete(int start,ipublic class StringBufferDemo3 { public static void main(String[] args) { //使用带参数的构造方法创建StringBuffer对象 StringBuffer sb = new StringBuffer("bigdata"); System.out.println("未做删除操作之前的StringBuffer:" + sb); // StringBuffer sb2 = sb.deleteCharAt(3); // // 操作的是同一个StringBuffer对象 // System.out.println(sb);----bigata // System.out.println(sb2);---bigata // System.out.println(sb==sb2);----true sb.deleteCharAt(3); System.out.println("做删除操作之后的StringBuffer:" + sb); //如果 index为负数或大于或等于length() 。 //index的值最大可以取到实际存储字符串的长度-1 // sb.deleteCharAt(30); // sb.deleteCharAt(6); System.out.println("==============================================="); //public StringBuffer delete(int start,int end) //删除此序列的子字符串中的字符。 // 子串开始于指定start并延伸到字符索引end - 1 ,或如果没有这样的字符存在的序列的结束。 // 如果start等于end ,则不作任何更改。 // start<=index nt end)



