为了对字符串进行修改,Java提供了一个StringBuffer类(也称字符串缓冲区)。
StringBuffer类和String类的最大区别在于它的内容和长度都是可以改变的。
StringBuffer类似一个字符容器,当在其中添加或者删除字符时,并不会产生新的StringBuffer对象
针对添加和删除字符的操作,StringBuffer类提供了一系列的方法
方法声明 | 功能描述 |
StringBuffer apppend(char c) | 添加参数到StringBuffer对象中 |
StringBuffer insert(int offset,String str) | 在字符串中的offset位置插入字符串str |
StringBuffer deleteCharAt(int index) | 删除此序列指定位置的字符 |
StringBuffer delete(int start,int end) | 删除StringBuffer对象中指定范围的字符或字符串序列 |
StringBuffer replace(int start,int end,String s) | 在StringBuffer对象中替换指定的字符或字符串序列 |
void setCharAt(int index,char ch) | 修改指定位置index处的字符序列 |
String toString() | 返回StringBuffer缓冲区中的字符串 |
StringBuffer reverse() | 将此字符序列列用其反转形式取代 |
。
案例学习5-8
public class Example08 {
public static void main(String[] args) {
System.out.println("1、添加------------------------");
add();
System.out.println("2、删除------------------------");
remove();
System.out.println("3、修改------------------------");
alter();
}
public static void add() {
StringBuffer sb = new StringBuffer(); // 定义一个字符串缓冲区
sb.append("abcdefg"); // 在末尾添加字符串
System.out.println("append添加结果:" + sb);
sb.insert(2, "123"); // 在指定位置插入字符串
System.out.println("insert添加结果:" + sb);
}
public static void remove() {
StringBuffer sb = new StringBuffer("abcdefg");
sb.delete(1, 5); // 指定范围删除
System.out.println("删除指定位置结果:" + sb);
sb.deleteCharAt(2); // 指定位置删除
System.out.println("删除指定位置结果:" + sb);
sb.delete(0, sb.length()); // 清空缓冲区
System.out.println("清空缓冲区结果:" + sb);
}
public static void alter() {
StringBuffer sb = new StringBuffer("abcdef");
sb.setCharAt(1, 'p'); // 修改指定位置字符
System.out.println("修改指定位置字符结果:" + sb);
sb.replace(1, 3, "qq"); // 替换指定位置字符串或字符
System.out.println("替换指定位置字符(串)结果:" + sb);
System.out.println("字符串翻转结果:" + sb.reverse());
}
}
运行结果→
1、添加------------------------
append添加结果:abcdefg
insert添加结果:ab123cdefg
2、删除------------------------
删除指定位置结果:afg
删除指定位置结果:af
清空缓冲区结果:
3、修改------------------------
修改指定位置字符结果:apcdef
替换指定位置字符(串)结果:aqqdef
字符串翻转结果:fedqqa
5.1.4 StringBuilder类
StringBuffer类和StringBuilder类的对象都可以被多次修改,并不产生新的未使用对象。
StringBuffer不能被同步访问,而StringBuilder可以被同步访问。 ------区别
对比StringBuilder与StringBuffer的运行效率→
案例学习5-9
public class Example09{
private static final int TIMES = 100000;
public static void main(String[] args) {
Example09.testString();
Example09.testStringBuffer();
Example09.testStringBuilder();
}
//String时间效率测试
public static void testString() {
long startTime = System.currentTimeMillis();
String str = "";
for (int i = 0; i < TIMES; i++) {
str += "test";
}
long endTime = System.currentTimeMillis();
System.out.println("String test usedtime: "
+ (endTime - startTime));
}
//StringBuffer时间效率测试(线程安全)
public static void testStringBuffer() {
long startTime = System.currentTimeMillis();
StringBuffer str = new StringBuffer();
for (int i = 0; i < TIMES; i++) {
str.append("test");
}
long endTime = System.currentTimeMillis();
System.out.println("StringBuffer test usedtime: " + (endTime - startTime));
}
//StringBuffer时间效率测试(非线程安全)
public static void testStringBuilder() {
long startTime = System.currentTimeMillis();
StringBuilder str = new StringBuilder();
for (int i = 0; i < TIMES; i++) {
str.append("test");
}
long endTime = System.currentTimeMillis();
System.out.println("StringBuilder test usedtime: " + (endTime - startTime));
}
}
运行结果→
String test usedtime: 4596
StringBuffer test usedtime: 4
StringBuilder test usedtime: 3