本文主要是介绍StringBuffer与StringBuilder 2024-8-21 22-13,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 一、StringBuffer
- 二、StringBuilder
- 三、总结
一、StringBuffer
StringBuffer
是一个可变的字符序列,它的存在是为了解决频繁操作字符串时产生大量临时对象的问题。
-
构造方法:
StringBuffer()
:创建一个空的字符串缓冲区,初始容量为 16 个字符。StringBuffer(int capacity)
:创建一个空的字符串缓冲区,具有指定的初始容量。StringBuffer(String str)
:创建一个字符串缓冲区,并将其初始内容设置为指定的字符串。
-
常用方法:
append()
:将指定的参数追加到字符串缓冲区的末尾。可以接受各种数据类型的参数,如基本数据类型、字符串、对象等。例如:StringBuffer sb = new StringBuffer("Hello"); sb.append(" World!"); System.out.println(sb); // 输出:Hello World!
insert()
:在指定位置插入指定的参数。例如:StringBuffer sb = new StringBuffer("Hello"); sb.insert(2, "abc"); System.out.println(sb); // 输出:Heabcllo
delete()
:删除指定范围内的字符。例如:StringBuffer sb = new StringBuffer("Hello World!"); sb.delete(5, 11);//左闭右开 System.out.println(sb); // 输出:Hello!
reverse()
:将字符串缓冲区中的字符序列反转。例如:StringBuffer sb = new StringBuffer("Hello"); sb.reverse(); System.out.println(sb); // 输出:olleH
length()
:返回字符串缓冲区的长度。capacity()
:返回当前字符串缓冲区的容量。如果需要的字符数量超过当前容量,StringBuffer
会自动增加容量。
-
线程安全性:
StringBuffer
是线程安全的,这意味着多个线程可以同时访问和操作同一个StringBuffer
对象,而不会出现数据不一致的情况。这是通过在方法上进行同步实现的。例如:
class ThreadSafeExample {public static void main(String[] args) {// 创建一个空的 StringBuffer 对象 sharedBufferStringBuffer sharedBuffer = new StringBuffer();// 创建第一个线程 thread1Thread thread1 = new Thread(() -> {// 在这个线程中,循环 1000 次向 sharedBuffer 中追加字符'A'for (int i = 0; i < 1000; i++) {sharedBuffer.append("A");}});// 创建第二个线程 thread2Thread thread2 = new Thread(() -> {// 在这个线程中,循环 1000 次向 sharedBuffer 中追加字符'B'for (int i = 0; i < 1000; i++) {sharedBuffer.append("B");}});// 启动第一个线程thread1.start();// 启动第二个线程thread2.start();try {// 等待第一个线程执行完毕thread1.join();// 等待第二个线程执行完毕thread2.join();} catch (InterruptedException e) {// 如果在等待过程中被中断,打印异常信息e.printStackTrace();}// 输出 sharedBuffer 的长度System.out.println(sharedBuffer.length());}
}
这段代码创建了两个线程,分别向同一个StringBuffer对象中追加不同的字符。通过使用join()方法,确保主线程等待两个子线程执行完毕后再输出StringBuffer的长度。
- 适用场景:
当需要在多线程环境下操作字符串时,StringBuffer
是一个合适的选择。例如,在一个多线程的服务器应用程序中,多个线程可能需要同时构建一个响应字符串,这时使用StringBuffer
可以确保数据的一致性。
二、StringBuilder
StringBuilder
与StringBuffer
类似,也是一个可变的字符序列,但它是非线程安全的。
-
构造方法:
StringBuilder()
:创建一个空的字符串生成器,初始容量为 16 个字符。StringBuilder(int capacity)
:创建一个空的字符串生成器,具有指定的初始容量。StringBuilder(String str)
:创建一个字符串生成器,并将其初始内容设置为指定的字符串。
-
常用方法:
与StringBuffer
的方法基本相同,包括append()
、insert()
、delete()
、reverse()
等。例如:
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World!");
System.out.println(sb); // 输出:Hello World!
- 性能优势:
由于StringBuilder
不需要进行线程同步,所以在单线程环境下,它的性能通常比StringBuffer
更高。例如:
// 获取当前系统时间(以毫秒为单位),用于记录开始时间
long startTime = System.currentTimeMillis();
// 创建一个 StringBuilder 对象
StringBuilder sb = new StringBuilder();
// 循环 100000 次
for (int i = 0; i < 100000; i++) {// 将循环变量 i 追加到 StringBuilder 对象 sb 中sb.append(i);
}
// 再次获取当前系统时间,计算从开始到现在经过的时间,并打印使用 StringBuilder 的操作时间
System.out.println("StringBuilder time: " + (System.currentTimeMillis() - startTime));// 再次获取当前系统时间(以毫秒为单位),用于记录新的开始时间
startTime = System.currentTimeMillis();
// 创建一个 StringBuffer 对象
StringBuffer sbf = new StringBuffer();
// 循环 100000 次
for (int i = 0; i < 100000; i++) {// 将循环变量 i 追加到 StringBuffer 对象 sbf 中sbf.append(i);
}
// 再次获取当前系统时间,计算从这个新的开始时间到现在经过的时间,并打印使用 StringBuffer 的操作时间
System.out.println("StringBuffer time: " + (System.currentTimeMillis() - startTime));
分别使用StringBuilder
和StringBuffer
进行大量的字符串拼接操作,可以看到StringBuilder
的执行时间通常更短。
- 适用场景:
在单线程环境下,当需要高效地操作字符串时,StringBuilder
是一个很好的选择。例如,在一个桌面应用程序中,只有一个主线程在操作字符串,这时使用StringBuilder
可以提高性能。
三、总结
StringBuffer
和StringBuilder
都是 Java 中用于操作可变字符串的工具类。它们的主要区别在于线程安全性和性能。StringBuffer
是线程安全的,但性能相对较低;StringBuilder
是非线程安全的,但在单线程环境下性能更高。在选择使用哪个类时,需要根据具体的应用场景来决定。如果是在多线程环境下操作字符串,应该使用StringBuffer
;如果是在单线程环境下,为了获得更好的性能,可以选择使用StringBuilder
。
这篇关于StringBuffer与StringBuilder 2024-8-21 22-13的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!