- 任何的字符串常量都是 String 类的匿名对象,而且 String 的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
- 所以
StringBuffer
和StringBulider
两个类就是为了方便字符串的修改(拼接、插入、删除、反转)。
StringBuffer 和 StringBulider 用处差不多,StringBuffer 只是比 StringBuilder 多了个同步关键字synchronized
,下述以前者为例。
1. 字符串拼接
在 String 中使用 " + " 来进行字符串连接,但是这个操作在 StringBuffer 类中需要更改为append()
方法,append可以接收所有数据类型。
public synchronized StringBuffer append(各种数据类型 b)
:字符串拼接
public class SB {
//为了方便进行字符串内容的修改
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append(" world");
System.out.println(sb);
}
}
String 和 StringBuffer 最大的区别在于:String 的内容无法修改,而 StringBuffer 的内容可以修改。频繁修改字符串的情况下建议使用StingBuffer。
2. String与StringBuffer的相互转换
① String => StringBuffer
a. 通过 StringBuffer 的构造方法:public StringBuffer(String str)
b. 通过append(String str)
方法
public class SB {
public static void main(String[] args) {
String str = "Hello world";
//通过StringBuffer的构造方法
StringBuffer sb1 = new StringBuffer(str);
//通过SringBuffer的append方法
StringBuffer sb2 = new StringBuffer();
sb2.append("Hello world!!!");
System.out.println(sb1);
System.out.println(sb2);
}
}
② StringBuffer => String
调用toString()
方法
public class SB {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello world");
//通过toString方法
System.out.println(sb.toString());
}
}
3. StringBuffer的独有方法
① 字符串反转:reverse()
② 删除指定位置字符串:delete(int start, int end)
,左闭右开区间
③ 在指定位置插入任意元素:insert(int offset, 各种数据类型 b)
public class SBDuYou {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello world");
System.out.println(sb.reverse());
System.out.println(sb.delete(0, 5));
System.out.println(sb.insert(0, 123));
}
}
面试题:请解释String与StringBuffer、StringBuilder的区别。
a. String类是常量内容不可修改,而StringBuffer与StringBuilder的内容可以修改。
b. StringBuffer使用同步处理,线程安全,性能较低;StringBuilder使用异步处理,线程不安全,性能较高。在普遍情况下,推荐使用StringBuilder
。
c. 当String对象使用“+”进行字符串拼接时,Javac编译器会将String对象变为StringBuilder而后调用append()方法来修改字符串内容,减少无用空间的开辟。