在这一小节中,我们将学习String
,StringBuffer
与StringBuilder
之间的区别。StringBuffer
与StringBuilder
有什么区别是一个流行的java面试问题。
本教程主要介绍String
类的主要功能,然后比较String
,StringBuffer
与StringBuilder
之间的区别。
1. String
String
类表示字符串,可以通过两种方式实例化String
。String str = "abc"; // 或者 String str = new String ("abc");
String
在Java中是不可变的,因此很容易在不同的线程或函数之间共享它。当使用双引号创建
String
时,它首先在JVM字符串池中查找具有相同值的String
,如果找到它则返回引用,否则它将创建String
对象,然后将它放入String
池中。这样JVM通过在不同的线程中使用相同的String
来节省大量空间。但是如果使用新的运算符,它会在堆内存中显式创建一个新的String
。+
运算符为String
重载并用于连接两个字符串。虽然在内部它使用StringBuffer
来执行此操作。String
覆盖equals()
和hashCode()
方法,只有两个字符串在相同的顺序中具有相同的字符时才相等。请注意,equals()
方法区分大小写,如果不查找区分大小写的检查,则应使用equalsIgnoreCase()
方法。String
表示UTF-16
格式的字符串。String
是一个final
类,除了private int hash
字段之外,所有字段都是final
。此字段包含hashCode()
函数值,仅在调用hashCode()
方法并在此字段中缓存时创建。此外,使用String
类的final
字段和一些计算生成散列,因此每次调用hashCode()
方法时,都会产生相同的输出。对于调用者来说,它就像每次都在进行计算,但在内部它会被缓存在哈希字段中。
2. String与StringBuffer
由于String
在Java中是不可变的,因此每当执行字符串操作(如连接,子字符串等)时,它会生成一个新的String并丢弃旧的String以进行垃圾收集。
这些都是繁重的操作,并在堆中产生大量垃圾。所以Java提供了StringBuffer
和StringBuilder
类用于String
操作。
StringBuffer
和StringBuilder
是java中的可变对象,并为String
操作提供append()
,insert()
,delete()
和substring()
方法。
3. StringBuffer 与 StringBuilder
在Java 1.4之前,StringBuffer
是String
操作的唯一选择,但它有一个缺点,即它的所有公共方法都是同步的。StringBuffer
提供线程安全性,但性能成本。
在大多数情况下,不在多线程环境中使用String
,因此Java 1.5引入了一个新的类StringBuilder
,类似于StringBuffer
,除了线程安全和同步。
因此,如果处于单线程环境中或者不关心线程安全性,则应使用StringBuilder
,否则请使用StringBuffer
。
4. String,StringBuffer与StringBuilder
String
是不可变的,而StringBuffer
和StringBuider
是可变类。StringBuffer
是线程安全和同步的,而StringBuilder
不是,因引StringBuilder
比StringBuffer
更快。- String 连接
+
操作符在内部使用StringBuffer
或StringBuilder
类。 - 对于非多线程环境中的
String
操作,应该使用StringBuilder
,否则使用StringBuffer
类。