字符串 vs StringBuffer vs StringBuilder

时间:2020-02-23 14:37:27  来源:igfitidea点击:

字符串是Java中使用最广泛的类之一。
StringBuffer和StringBuilder类提供了操作字符串的方法。
我们将研究StringBuffer和StringBuilder之间的区别。
StringBuffer vs StringBuilder是一个受欢迎的Java面试问题。

String vs StringBuffer vs StringBuilder

字符串是Java核心访谈中最重要的主题之一。
如果要编写在控制台上打印某些内容的程序,则使用String。

本教程的重点是String类的主要功能。
然后,我们将比较StringBuffer和StringBuilder类。

Java中的字符串

  • String类表示字符串,我们可以通过两种方式实例化String。

  • 字符串在Java中是不可变的。
    因此适合在多线程环境中使用。
    我们可以跨功能共享它,因为不必担心数据不一致。

  • 当我们使用双引号创建String时,JVM首先在字符串池中查找具有相同值的String。
    如果找到,它将从池中返回字符串对象的引用。
    否则,它将在字符串池中创建String对象并返回引用。
    JVM通过在不同线程中使用相同的String来节省大量内存。

  • 如果使用new运算符创建字符串,则会在堆内存中创建它。

  • +运算符对于String重载。
    我们可以使用它来连接两个字符串。
    尽管在内部它使用StringBuffer执行此操作。

  • 字符串覆盖equals()和hashCode()方法。
    只有两个字符串具有相同的字符序列,它们才相等。
    equals()方法区分大小写。
    如果要查找不区分大小写的检查,则应使用equalsIgnoreCase()方法。

  • 该字符串对字符流使用UTF-16编码。

  • 字符串是最后一堂课。
    除" private int hash"外,所有字段均为final。
    该字段包含hashCode()函数值。
    仅当首次调用hashCode()方法然后将其缓存在此字段中时,才计算哈希码值。
    此外,使用String类的最终字段进行一些计算来生成哈希。
    因此,每次调用hashCode()方法时,都会得到相同的输出。
    对于调用者而言,似乎每次都在进行计算,但是内部将其缓存在哈希字段中。

字符串vs StringBuffer

由于String在Java中是不可变的,因此每当我们执行诸如串联,子字符串等之类的String操作时,它都会生成一个新的String并丢弃较旧的String进行垃圾回收。

这些是繁重的操作,并且会在堆中产生大量垃圾。
因此,Java提供了应该用于String操作的StringBuffer和StringBuilder类。

StringBuffer和StringBuilder是Java中的可变对象。
它们提供String操作的append(),insert(),delete()和substring()方法。

StringBuffer与StringBuilder

在Java 1.4之前,StringBuffer是String操作的唯一选择。
但是,其所有公共方法都是同步的,这是一个缺点。
StringBuffer提供线程安全性,但会降低性能。

在大多数情况下,我们不在多线程环境中使用String。
因此Java 1.5引入了一个新的StringBuilder类,该类与StringBuffer相似,除了线程安全性和同步性。

StringBuffer具有一些另外的方法,例如子字符串,长度,容量,trimToSize等。
但是,由于在String中也存在所有这些方法,因此不需要这些方法。
这就是为什么在StringBuilder类中从未实现这些方法的原因。

在考虑了StringBuffer的缺点之后,在Java 1.0中引入了StringBuffer,而在Java 1.5中引入了StringBuilder类。

如果您在单线程环境中或者不关心线程安全,则应使用StringBuilder。
否则,请使用StringBuffer进行线程安全操作。

StringBuilder vs StringBuffer性能

我试图检查对性能的影响,因为它与一个示例程序同步,该示例程序多次对StringBuffer和StringBuilder对象执行append()

String str = "ABC";
//or 
String str = new String("ABC");

我为StringBuffer对象运行了相同的代码,还检查了时间和内存值。
我已经为每种情况执行了5次代码,然后计算了平均值。

Value of iStringBuffer (Time, Memory)StringBuilder (Time, Memory)
10,00,000808, 149356704633, 149356704
1,00,00,0007448, 1477838886179, 147783888

很明显,即使在单线程环境下,StringBuilder的性能也比StringBuffer好。
性能上的这种差异可能是由StringBuffer方法中的同步引起的。

字符串vs StringBuffer vs StringBuilder

  • String是不可变的,而StringBuffer和StringBuilder是可变的类。

  • StringBuffer是线程安全和同步的,而StringBuilder不是。
    这就是为什么StringBuilder比StringBuffer更快的原因。

  • 字符串串联运算符(+)在内部使用StringBuffer或者StringBuilder类。

  • 对于非多线程环境中的String操作,应使用StringBuilder,否则应使用StringBuffer类。

这样就可以快速汇总String,StringBuffer和StringBuilder之间的差异。
在大多数常规编程方案中,StringBuilder比StringBuffer更适合。