本文翻译自:String vs StringBuffer vs StringBuilder | DigitalOcean
字符串是JAVA中使用最广泛的类之一。StringBuffer和StringBuilder类提供了操作字符串的方法。本文将研究StringBuffer和StringBuilder之间的区别。StringBuffer vs StringBuilder是一个流行的Java面试问题。
字符串是核心java访谈中最重要的主题之一。如果您正在编写一个在控制台上打印内容的程序,则使用字符串。本文旨在关注字符串类的主要特性。然后比较StringBuffer和StringBuilder类。
由于字符串在Java中是不可变的,每当我们进行字符串操作(如连接、子字符串等)时,它会生成一个新字符串,并丢弃旧字符串进行垃圾收集。这些都是繁重的操作,并在堆中生成大量垃圾。因此,Java提供了StringBuffer和StringBuilder类,它们应该用于字符串操作。StringBuffer和StringBuilder是Java中的可变对象。它们为字符串操作提供了Append()、insert()、delete()和substring()方法。
在Java1.4之前,StringBuffer是字符串操作的唯一选择。但是,它有一个缺点,它的所有公共方法都是同步的。StringBuffer提供线程安全性,但以性能为代价。在大多数情况下,我们不会在多线程环境中使用字符串。因此,Java1.5引入了一个新的类StringBuilder,除了线程安全和同步之外,它与StringBuffer类似。StringBuffer有一些额外的方法,如子字符串、长度、容量、trimToSize等。然而,这些方法不是必需的,因为您在字符串中也有这些方法。这就是为什么这些方法从未在StringBuilder类中实现。StringBuffer是在Java 1.0中引入的,而StringBuilder类是在查看了StringBufer的缺点之后在Java 1.5中引入的。如果您处于单线程环境中或不关心线程安全,则应使用StringBuilder。否则,请使用StringBuffer进行线程安全操作。
我试图检查对性能的影响,因为与一个示例程序同步,该程序多次对StringBuffer和StringBuilder对象执行“append()”。
package com.journaldev.java;
import java.util.GregorianCalendar;
public class TestString {
public static void main(String[] args) {
System.gc();
long start=new GregorianCalendar().getTimeInMillis();
long startMemory=Runtime.getRuntime().freeMemory();
StringBuffer sb = new StringBuffer();
//StringBuilder sb = new StringBuilder();
for(int i = 0; i<10000000; i++){
sb.append(":").append(i);
}
long end=new GregorianCalendar().getTimeInMillis();
long endMemory=Runtime.getRuntime().freeMemory();
System.out.println("Time Taken:"+(end-start));
System.out.println("Memory used:"+(startMemory-endMemory));
}
}
我还为StringBuffer对象运行了相同的代码,以检查时间和内存值。我对每种情况执行了5次代码,然后计算了平均值。
很明显,即使在单线程环境中,StringBuilder的性能也优于StringBuffer。这种性能差异可能是由StringBuffer方法中的同步引起的。
参考文献: