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<end //bigata // sb.delete(2,5);//bia(左闭右开) // sb.delete(2,6);//删除gata还剩bi // sb.delete(2,10); //注意开始位置一定是已经存在的索引,否则报错 // sb.delete(8,10); System.out.println(sb); //需求:删除StringBuffer中的所有字符 sb.delete(0, sb.length()); System.out.println("删除StringBuffer中的所有字符:" + sb); } }
nt end)