【高级编程】实用类详解(补充)StringBuffer类 和 StringBuilder类


为什么使用StringBuffer?

StringBuffer 是 Java 中的一个可变字符序列类,允许在原始对象上进行修改,而不会生成新的字符串对象。与 String 比较,StringBuffer 具有以下优势:

  1. 可变性: StringBuffer 对象的内容可以被修改而不创建新的对象,适合需要频繁修改字符串的场景。
  2. 性能: 对于需要大量字符串拼接或修改的操作,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
  • 20
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值