字符串 vs StringBuffer vs StringBuilder
字符串是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 i | StringBuffer (Time, Memory) | StringBuilder (Time, Memory) |
---|---|---|
10,00,000 | 808, 149356704 | 633, 149356704 |
1,00,00,000 | 7448, 147783888 | 6179, 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更适合。