“简单不先于复杂,而是在复杂之后.” —— Alan Perlis
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主要用在全局变量中。