文章标题:
Java字符串操作深度解析:StringBuilder与StringBuffer详解
文章内容
文章目录
- 字符串的不可变性
- StringBuilder与StringBuffer
- 函数运用
字符串的不可变性
字符串之所以不可变,是因为其内部采用了private
修饰,仅能在类的内部被访问,外部无法直接对其进行修改。例如下面的代码:
public class test {
public static void main(String[] args) {
String str = "abc";
str += "def";
System.out.println(str);
}
}
StringBuilder与StringBuffer
基础示例
public class test {
public static void main1(String[] args) {
String str = "abc";
str += "def";
System.out.println(str);
}
public static void main(String[] args) {
String str = "hello";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str);
stringBuilder.append("abc");
str = stringBuilder.toString();
System.out.println(str);
}
}
性能差异剖析
- 速度对比:通常情况下,StringBuilder的执行速度要明显快于String。这是因为String每次进行拼接操作时都会创建新的String对象,而使用StringBuilder进行
append
操作后再转为String,避免了频繁的对象创建与销毁,减少了性能消耗。 - 对象生成情况:每次String进行拼接都会产生新的对象,而StringBuilder和StringBuffer在拼接过程中不会生成新的对象,直接在原对象基础上进行操作。
性能测试代码示例
public class Test {
public static void main(String[] args) {
// 记录String操作的起始时间
long start = System.currentTimeMillis();
String s = "";
for (int i = 0; i < 10000; i++) {
s += i;
}
// 记录String操作的结束时间并计算耗时
long end = System.currentTimeMillis();
System.out.println("String的时间:" + (end - start));
// 记录StringBuilder操作的起始时间
long start1 = System.currentTimeMillis();
StringBuilder stringBuilder = new StringBuilder("");
for (int i = 0; i < 10000; i++) {
stringBuilder.append(i); // 执行拼接操作
}
// 记录StringBuilder操作的结束时间并计算耗时
long end1 = System.currentTimeMillis();
System.out.println("StringBuilder的时间:" + (end1 - start1));
// 记录StringBuffer操作的起始时间
long start2 = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer("");
for (int i = 0; i < 10000; i++) {
stringBuffer.append(i);
}
// 记录StringBuffer操作的结束时间并计算耗时
long end2 = System.currentTimeMillis();
System.out.println("StringBuffer的时间:" + (end2 - start2));
}
}
线程安全性区别
- StringBuffer的线程安全性:StringBuffer是线程安全的,其所有方法都使用
synchronized
修饰,这意味着同一时间只能有一个线程执行其方法,通过锁机制保证线程安全,但锁的获取与释放会带来一定的性能开销,所以StringBuffer比StringBuilder慢。 - 线程安全的含义:线程安全指的是同一时间仅有一个线程能够执行相关操作,执行完成后会释放锁。但锁的获取与释放过程会消耗时间,因此StringBuffer在性能上不如StringBuilder。
函数使用
特殊方法
- reverse方法:可对字符串进行逆置操作。例如:
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("hello");
stringBuilder.reverse();
System.out.println(stringBuilder);
}
三者区别总结
- String的内容不可修改,每次拼接都会生成新的对象。
- StringBuilder和StringBuffer的内容可以修改,直接在原对象上进行操作。
- StringBuilder未采用同步处理,是线程不安全的;StringBuffer采用了同步处理,是线程安全的。它们的函数有相似之处。
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12721.html