首页 > 编程语言 >【高级编程】实用类详解(补充)StringBuffer类 和 StringBuilder类

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

时间:2024-09-09 14:53:09浏览次数:13  
标签:String StringBuffer System 详解 StringBuilder println sb out

文章目录


为什么使用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

标签:String,StringBuffer,System,详解,StringBuilder,println,sb,out
From: https://blog.csdn.net/m0_66584716/article/details/141936136

相关文章

  • 【高级编程】实用类详解(下)万字整理Java时间日期类 JDK8新日期
    文章目录日期时间DateSimpleDateFormatCalendarJDK8新日期LocalDateTime&LocalDate&LocalTimeDateTimeFormater计算Period&DurationzonedDateTimeInstant类型转换注意事项日期时间Datejava.util.Date类:表示日期和时间。提供操作日期和时间各组成部分的方法。......
  • 【Material-UI】Stepper 组件中的 Vertical Stepper 和 Mobile Stepper 详解
    文章目录一、VerticalStepper组件概述1.组件介绍2.核心功能二、VerticalStepper的使用场景1.适合移动端的垂直布局2.高效的步骤管理三、MobileStepper组件概述1.组件介绍2.MobileStepper的核心功能1)Text文本显示2)Dots小圆点显示3)Progress进度条......
  • 操作符详解(上)
    目录二进制介绍二进制2进制转10进制10进制转2进制数字2进制转8进制和16进制2进制转8进制2进制转16进制原码、反码、补码移位操作符左移操作符右移操作符位操作符:&、|、^逗号表达式二进制介绍在初学计算机时我们常常会听到2进制、8进制、10进制、16进制…这些听着......
  • 软连接&硬链接详解
    目录一、软连接(SymbolicLink或SoftLink)1.1.定义1.2.特点1.3.用途1.4. 软链接的创建方式示例1.5.注意事项1.跨文件系统链接2.链接到目录3.链接失效4.权限问题5.递归复制时的处理6.删除操作7.链式软链接8.使用场景二、硬链接(HardLink)2.1.定......
  • Javaweb-JDBC-API详解
    packageDUIXIANG;publicclassAccount{privateintid;privateStringname;privateDoublemoney;publicintgetId(){returnthis.id;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnthis.name;}publicvoidsetName(String......
  • 3.5 MySQL数据的维护详解(插入数据、更新数据、删除数据)
    文章目录MySQL插入数据3.5.1基本的INSERT语句插入单个值插入多列值插入多行数据2.使用子查询向表中插入数据插入子查询结果作为单行插入子查询结果作为多行注意事项3.5.2MySQL更新数据基本语法示例更新单列更新多列更新所有行使用函数更新数据基于其他表更新数据注......
  • 数据结构-堆-详解
    数据结构-堆-详解1.性质大根堆小根堆2.实现2.1structHeap、HeapInit、HeapDestroy2.2HeapPushAdjustUp2.3HeapPopAdjustDown2.4HeapTop、HeapSize、HeapEmpty3.应用3.1堆排建堆排序3.2TopK问题1.性质堆是一种特殊的完全二叉树,其父节点总是不大于/不小于子节......
  • C++ iostream、iomanip 头文件详解
    C++iostream、iomanip头文件详解首先,我们来看看iostream。相信大家都知道iostream,这个库可以说是最常用的几个库之一了。iostream库提供了输入输出流。比如cin、cout,都是在iostream里的。所以,我们经常会用到iostream这个库。iostream这个名字很好理解,InputOutputStream,输......
  • C/C++中extern函数使用详解
    extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定目录一、定义和声明的区别二、extern用法2.1extern函数2.2extern变量2.3在C++文件中调用C方式编译的函数三、通俗讲......
  • 14、Flink SQL 的 事件时间详解
    事件时间事件时间允许程序按照数据中包含的时间来处理,这样可以在有乱序或者晚到的数据的情况下产生一致的处理结果,它可以保证从外部存储读取数据后产生可以复现(replayable)的结果。事件时间可以让程序在流式和批式作业中使用同样的语法,在流式程序中的事件时间属性,在批式程......