5.2 StringBuffer和StringBuilder

系列 - Java API
目录
本手册介绍了Java中StringBuffer和StringBuilder的用法,包括如何添加、删除和修改字符串内容。同时,通过一个模拟订单号生成案例,展示了String、StringBuffer和StringBuilder在效率上的差异,并要求学生补全代码,分别用String和StringBuffer实现订单号的生成。
任务
任务一:StringBuffer
public class Example08 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
System.out.println("1、添加------------------------");
add(sb);
System.out.println("2、删除------------------------");
remove(sb);
System.out.println("3、修改------------------------");
alter();
}
public static void add(StringBuffer sb) {
sb.append("我王小明");
System.out.println("append添加结果:" + sb);
sb.insert(1, "的名字是");
System.out.println("insert添加结果:" + sb);
sb.append("白");
System.out.println("append添加结果:" + sb);
}
public static void alter() {
StringBuffer sb = new StringBuffer("我的性别是王小白");
sb.replace(2, 4, "姓名");
System.out.println("替换指定位置字符串:" + sb);
sb.setCharAt(0, '你');
System.out.println("修改指定位置字符:" + sb);
System.out.println("翻转:" + sb.reverse());
}
public static void remove(StringBuffer sb) {
sb.delete(0, 5);
System.out.println("delete的结果:" + sb);
sb.deleteCharAt(3);
System.out.println("deleteCharAt结果:" + sb);
sb.delete(0, sb.length());
System.out.println("清空:" + sb);
}
}
任务二:StringBuilder
public class Example09 {
private static final int TIMES = 100000;
public static void main(String[] args) {
testString();
testStringBuffer();
testStringBuilder();
}
// String时间效率
public static void testString() {
long start = System.currentTimeMillis();
String str = "";
for (int i = 0; i < TIMES; i++) {
str += "test";
}
long end = System.currentTimeMillis();
System.out.println("String测试耗时:" + (end - start) + "ms");
}
// StringBuffer时间效率(线程安全)
public static void testStringBuffer() {
long start = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < TIMES; i++) {
sb.append("test");
}
long end = System.currentTimeMillis();
System.out.println("StringBuffer测试耗时:" + (end - start) + "ms");
}
// StringBuilder时间效率(非线程安全)
public static void testStringBuilder() {
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder("hello");
for (int i = 0; i < TIMES; i++) {
sb.append("test");
}
long end = System.currentTimeMillis();
System.out.println("StringBuilder测试耗时:" + (end - start) + "ms");
}
}
作业
模拟订单号生成(补全代码)
在超市购物时,小票上都会有一个订单号,而且每个订单号都是唯一的。
本例要求编写一个程序,模拟订单系统中订单号的生成。在生成订单号时,使用年月日和时间组合生成唯一订单号。
例如,给定一个包括年月日以及时间的数组arr={2024,1107,1040}
,将其拼接成字符串OID:[202005041101]
,作为一个订单号。
运行截图:
要求:
补全下面的代码,分别使用 String 和 StringBuffer 实现上面的功能。
public class OrderID {
public static void main(String[] args) {
System.out.println("====String实现====");
int[] time = {2024, 1107, 1040};
String orderID = arrayToString(time);
System.out.println("订单号 " + orderID);
System.out.println("\n====StringBuffer实现====");
int[] time2 = {2023, 1006, 1200};
String orderID2 = arrayToString(time2);
System.out.println("订单号 " + orderID2);
}
/**
* 将数组拼接成字符串,并在首尾添加`OID:[]`
* 注意:使用String实现
* @param arr 存放数字的数组
* @return 拼接后的字符串,格式为`[202411071040]`
*/
public static String arrayToString(int[] arr) {
}
/**
* 将数组拼接成字符串,并在首尾添加`OID:[]`
* 注:使用StringBuffer实现
* @param arr 存放数字的数组
* @return 拼接后的字符串,格式为`[202411071040]`
*/
public static String arrayToStringUsingBuffer(int[] arr) {
}
}
编程提示
String实现思路:
String result = "OID:[";
for (int i = 0; i < timeArray.length; i++) {
result += timeArray[i];
}
result += "]";
return result;
StringBuffer实现思路:
StringBuffer sb = new StringBuffer();
sb.append("OID:[");
for (int time : timeArray) {
sb.append(time);
}
sb.append("]");
return sb.toString();
学习小结
本节收获
✅ StringBuffer操作 - 掌握了安全高效的字符串修改方法
✅ StringBuilder应用 - 学会了最快速的字符串处理技巧
✅ 性能对比 - 理解了三种字符串工具的适用场景
✅ 实战应用 - 完成了订单号生成系统的编程练习
关键要点:
- 🚀 频繁字符串操作选StringBuilder(单线程)
- 🔒 多线程环境选StringBuffer(线程安全)
- 📝 简单操作用String(偶尔使用)
- ⚡ 性能差距可达几十倍到几百倍
现在你已经掌握了高效的字符串处理技术!