为什么使用StringBuffer?
StringBuffer
是 Java 中的一个可变字符序列类,允许在原始对象上进行修改,而不会生成新的字符串对象。与 String
比较,StringBuffer
具有以下优势:
- 可变性:
StringBuffer
对象的内容可以被修改而不创建新的对象,适合需要频繁修改字符串的场景。 - 性能: 对于需要大量字符串拼接或修改的操作,
StringBuffer
性能更优,因为它减少了内存分配和垃圾回收的开销。
使用 String
public class StringExample {
public static void main(String[] args) {
String str = "Hello";
str += " World"; // 每次拼接都会创建新的 String 对象
str += "!";
System.out.println(str); // 输出: Hello World!
}
}
每次使用 +
操作符时,都会创建一个新的 String
对象并复制内容,性能较低。
使用 StringBuffer
public class StringBufferExample {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 直接在原始对象上修改
sb.append("!");
System.out.println(sb.toString()); // 输出: Hello World!
}
}
StringBuffer
在同一个对象上进行修改,性能更好,适合频繁修改字符串的场景。
StringBuffer
对字符串频繁修改(如字符串连接)时,使用StringBuffer类可以大大提高程序执行效率
1.声明
StringBuffer strb = new StringBuffer();
StringBuffer strb = new StringBuffer("aaa");
2.常用方法
方法 | 描述 |
---|---|
append(String str) | 将指定的字符串追加到此 StringBuffer 对象的末尾 |
insert(int offset, String str) | 将指定的字符串插入到此 StringBuffer 对象的指定位置 |
delete(int start, int end) | 删除从指定开始索引到结束索引之间的字符 |
replace(int start, int end, String str) | 用指定的字符串替换从指定开始索引到结束索引之间的字符 |
reverse() | 将此 StringBuffer 对象中的字符序列反转 |
charAt(int index) | 返回指定索引处的字符 |
setCharAt(int index, char ch) | 用指定的字符替换指定索引处的字符 |
length() | 返回 StringBuffer 对象的当前长度(字符数) |
capacity() | 返回当前 StringBuffer 对象的容量(可容纳的字符数) |
toString() | 将 StringBuffer 对象的内容转换为 String 对象 |
StringBuffer sb = new StringBuffer("Hello");
// 追加字符串
sb.append(" World");
System.out.println("After append: " + sb);
// 插入字符串
sb.insert(6, "Amazing ");
System.out.println("After insert: " + sb);
// 删除字符
sb.delete(6, 14);
System.out.println("After delete: " + sb);
// 替换字符
sb.replace(6, 11, "Java");
System.out.println("After replace: " + sb);
// 反转字符串
sb.reverse();
System.out.println("After reverse: " + sb);
// 获取字符
char ch = sb.charAt(3);
System.out.println("Character at index 3: " + ch);
// 设置字符
sb.setCharAt(3, 'X');
System.out.println("After setCharAt: " + sb);
// 获取长度和容量
int length = sb.length();
int capacity = sb.capacity();
System.out.println("Length: " + length);
System.out.println("Capacity: " + capacity);
// 转换为字符串
String str = sb.toString();
System.out.println("Converted to String: " + str);
After append: Hello World
After insert: Hello Amazing World
After delete: Hello World
After replace: Hello Java
After reverse: avaJ olleH
Character at index 3: J
After setCharAt: avaX olleH
Length: 10
Capacity: 21
Converted to String: avaX olleH
3.举例
将一个数字字符串格式化为带有千位分隔符的形式(即在每三位数字之间添加逗号)
//将一个数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔
public class NumberFormatter {
public static String formatNumber(String number) {
// 检查字符串是否为空
if (number == null || number.trim().isEmpty()) {
return number;
}
StringBuffer formattedNumber = new StringBuffer();
int length = number.length();
// 从右到左遍历字符串
for (int i = length - 1; i >= 0; i--) {
if (i < length - 1 && (length - i -1) % 3 == 0) {
formattedNumber.append(',');
}
formattedNumber.append(number.charAt(i));
}
// reverse() 方法将字符串缓冲区中的字符顺序反转回正常的顺序
// (因为之前是从右到左添加的)
formattedNumber.reverse();
// 将 StringBuffer 转换为 String 并返回格式化后的结果
return formattedNumber.toString();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一串数字:");
String inputNumber = scanner.next();
System.out.println(formatNumber(inputNumber));
}
}
另一种写法:
long begin = System.currentTimeMillis();
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一串数字:");
String inputNumber = scanner.next();
StringBuffer formattedNumber = new StringBuffer(inputNumber);
for (int i = inputNumber.length() - 3; i > 0; i -= 3) {
formattedNumber.insert(i, ",");
}
System.out.println("格式化后的数字: " + formattedNumber);
long time = System.currentTimeMillis() - begin;
System.out.println("处理时间: " + time + "毫秒");
上述例子中用到了 System.currentTimeMillis()
,下面介绍一下时间戳。
4.时间戳
System.currentTimeMillis()
是 Java 中的一个静态方法,用于获取当前时间的时间戳(即自1970年1月1日00:00:00 UTC起经过的毫秒数)。该方法属于 java.lang.System
类。
long currentTime = System.currentTimeMillis();
- 返回一个
long
类型的值,表示当前时间的毫秒值。
StringBuilder
StringBuffer 是可变的字符串,String 是不可变对象,经常改变内容的字符串最好不要使用 String,可使用更高效的 StringBuffer,JDK5.0 后提供了 StringBuilder,等价 StringBuffer。
StringBuffer VS StringBuilder
stringBuffer
虽速度慢,但是线程安全,方法是同步的。
StringBuffer sb = new stringBuffer();
sb.append("he11o");
sb.append(",gmy"); // 向后追加
sb.insert(0,"HZ"); // 指定位置进行插入
System.out.printin("sb: " + sb.tostring()); // 转换为string类型
sb: HZhe11o,gmy
stringBuilder
速度快,但是线程不安全,方法不是同步的。
StringBuilder sb = new stringBuilder();
sb1.append("he11o");
sb1.append(",gmy"); // 向后追加
sb1.insert(0,"HZ"); // 指定位置进行插入
System.out.print]n("sb: " + sbl.tostring()); // 转换为string类型
sb: HZhe11o,gmy