JavaSE|StringBuffer
StringBuffer是线程安全的可变字符串。
StringBuffer和String的区别:
StringBuffer长度和内容可变,String不可变。
如果使用StringBuffer做字符串拼接,不会浪费太多的资源。
构造方法
1. public StringBuffer() 最常用
无参构造方法。其初始容量为 16 个字符。
super(16);
2. public StringBuffer(int capacity)
指定容量的字符串缓冲区对象。
super(capacity);
3. public StringBuffer(String str)
指定字符串内容的字符串缓冲区对象。
super(str.length() + 16);
添加功能
1. public StringBuffer append(String str)
可以把任意类型数据添加到字符串缓冲区,并返回字符串缓冲区本身。
StringBuffer sb = new StringBuffer();
// public StringBuffer append(String str)
StringBuffer sb2 = sb.append("hello");
System.out.println("sb:" + sb); //hello
System.out.println("sb2:" + sb2); //hello
System.out.println(sb == sb2); // true(说明没有重新开空间)
StringBuffer sb = new StringBuffer();
//可以添加任意类型的数据
// 链式编程
sb.append("hello").append(true).append(12).append(34.56);
System.out.println("sb:" + sb); //hellotrue1234.56
sb.insert(5, "world");
System.out.println("sb:" + sb); //helloworldtrue1234.56
2. public StringBuffer insert(int offset,String str)
在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
删除功能
1. public StringBuffer deleteCharAt(int index)
删除指定位置的字符,并返回本身
StringBuffer sb = new StringBuffer();
// 添加功能
sb.append("hello").append("world").append("java");
System.out.println("sb:" + sb);
sb.deleteCharAt(1); // hlloworldjava
// 删除第一个l这个字符
sb.deleteCharAt(1); //hloworldjava
2. public StringBuffer delete(int start,int end)
删除指定位置开始指定位置结束(包左不包右)的内容,并返回本身
StringBuffer sb = new StringBuffer();
// 添加功能
sb.append("hello").append("world").append("java");
System.out.println("sb:" + sb);
// 删除world这个字符串
// sb.delete(5, 10);
// 删除所有的数据
sb.delete(0, sb.length());
替换功能
1. public StringBuffer replace(int start,int end,String str)
StringBuffer sb = new StringBuffer();
sb.append("hello");
sb.append("world");
sb.append("java");
System.out.println("sb:" + sb); //helloworldjava
// 把world这个数据替换为"节日快乐"
sb.replace(5, 10, "节日快乐");
System.out.println("sb:" + sb); //hello节日快乐java
反转功能
1. public StringBuffer reverse()
将此字符序列用其反转形式取代
StringBuffer sb = new StringBuffer();
sb.append("霞青林爱我");
System.out.println("sb:" + sb); //霞青林爱我
sb.reverse();
System.out.println("sb:" + sb); //我爱林青霞
}
截取功能
1. public String substring(int start)
2. public String substring(int start,int end)
注意截取功能的返回值类型不再是StringBuffer本身。
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world").append("java");
System.out.println("sb:" + sb);
// 截取功能
// public String substring(int start)
String s = sb.substring(5);
System.out.println("s:" + s); //worldjava
System.out.println("sb:" + sb); //helloworldjava
// public String substring(int start,int end)
String ss = sb.substring(5, 10);
System.out.println("ss:" + ss); //world
System.out.println("sb:" + sb); //helloworldjava
StringBuffer 和 String 的相互转换
String 转 StringBuffer
1. public StringBuffer(String str) 建议
2. public StringBuffer append(String str)
String s = "hello";
StringBuffer sb = new StringBuffer(s);
StringBuffer sb1 = new StringBuffer();
sb.append(s);
StringBuffer 转 String
1. public String(StringBuffer buffer)
2. public String toString() 建议
StringBuffer buffer = new StringBuffer("java");
String str = new String(buffer);
String str1 = buffer.toString();
StringBuilder和StringBuffer
StringBuilder是一个可变的字符序列。提供一个与 StringBuffer 兼容的 API,但不保证同步。被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
面试题
1.String, StringBuffer, StringBuilder的区别?
A:String是内容不可变的,而StringBuffer和StringBuilder都是内容可变的。
B:StringBuffer是同步的,数据安全(多线程情况下),效率低;StringBuilder是不同步的,数据不安全(多线程情况下),效率高。
2.StringBuffer和数组的区别?
二者都可以看做容易,装其他数据。
但是StringBuffer的数据最终是一个字符串数据;而数组可以放置多种数据,但必须是同一数据类型的。
**3.**String和StringBuffer作为参数传递
public class StringBufferDemo {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
System.out.println(s1 + "---" + s2);// hello---world
change(s1, s2);
System.out.println(s1 + "---" + s2);// hello---world
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
System.out.println(sb1 + "---" + sb2);// hello---world
change(sb1, sb2);
System.out.println(sb1 + "---" + sb2);// hello---worldworld
}
public static void change(StringBuffer sb1, StringBuffer sb2) {
sb1 = sb2;
sb2.append(sb1);
}
public static void change(String s1, String s2) {
s1 = s2;
s2 = s1 + s2;
}
}
- 对基本类型,形式参数的改变不影响实际参数。
- 对引用类型,形式参数的改变直接影响实际参数。
- String作为参数传递,效果和基本类型作为参数传递是一样的。
- StringBuffer作为参数传递,赋值操作不影响实际参数的值,但append()方法会影响。对StringBuffer不要随便用赋值操作。