Java中有三种字符串类型:String
、StringBuilder
、StringBuffer
,那么它们之间有什么区别呢,又应该在怎样的场景中使用?
String
String
是字符串常量,一旦创建之后就不可以改变其内容,即是immutable
(不可变)的,其类的部分定义如下:
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
其中value[]
是用来存储字符串的,被声明为final
,因此只能赋值一次,之后不能再被修改。有些同学可能会问,String
在赋值之后,是可以被重新赋值的啊,其实,它是创建一个新的String
来实现的。如下代码:
public static void main(String[] args)
{
String a = "hello";
System.out.println(a.hashCode());
a = "world";
System.out.println(a.hashCode());
}
输出的两行结果不一样的,说明a
被重新赋值之后,跟赋值前不是同一个对象。
StringBuffer
StringBuffer
跟String
区别是,前者是可变的,是字符串变量,而且,StringBuffer
是线程安全的。如果需要频繁修改字符串内容,就可以使用StringBuffer
。
StringBuffer
上的主要操作是 append
和 insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append
方法始终将这些字符添加到缓冲区的末端;而 insert
方法则在指定的点添加字符。
StringBuilder
StringBuilder
也是一个字符串变量,但它是非线程安全的。这个类是在JDK5.0新增的,它是设计作为StringBuffer
的一个简易替换,用于单线程使用的情况(很普遍)。由于它是非线程安全,因此在效率上是快于线程安全的StringBuffer
。
三者区别
-
String
是字符串常量,StringBuffer
、StringBuilder
是字符变量 -
StringBuffer
是线程安全的,StringBuilder
是非线程安全的
使用场景
- 如果只操作少量数据,建议使用
String
;单线程操作大量数据,使用StringBuilder
;多线程操作大量数据则使用StringBuffer
- 不要使用
String
的+
来进行频繁的字符串拼接操作,应用使用StringBuffer
或StringBuilder
- 为了获得更好的性能,在构造
StirngBuffer
或StirngBuilder
时应尽可能指定它们的容量。当然,如果你操作的字符串长度(length)不超过 16 个字符就不用了,当不指定容量(capacity)时默认构造一个容量为16的对象。不指定容量会显著降低性能 - StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中。