Java中关于字符串最多见的三种存储形式是:String
、StringBuffer
、StringBuilder
。它们都是对象,而非基本数据类型。html
其中,String
是最多见的一种用于定义和存储字符串的形式。java
下面咱们将分析一下这三种Object的区别和使用场景。git
首先咱们看一下这三个类的源码:github
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
// ...
}
复制代码
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
//...
@Override
public synchronized int length() {
return count;
}
//...
}
复制代码
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
//...
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
//...
}
复制代码
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
}
复制代码
从源码能够发现,String、StringBuilder、StringBuffer都是用char数组来存储String的。三者之间的区别在于:数组
String
利用final char[]
存储数据,而另外二者则是char[]
。这意味着String是不可变的,而StringBuilder
和StringBuffer
则是可变的。安全
这里引用Matrix海子
的一句话对此进行总结:对String对象的任何改变都不影响到原对象,相关的任何change操做都会生成新的对象
。多线程
从线程安全性上看:String是常量,那就是线程安全的。StringBuilder的方法没有加同步锁,而StringBuffer的对方法加了同步锁,因此StringBuilder是非线程安全的。app
从性能上看,String发生改变时,总会建立新的String对象,然后将指针指向这个新的String对象。而java的垃圾收集是经过JVM的GC进行的,这样就致使假以下一次GC还未启动,已经产生了大量的再也不被使用的String对象,那么就会大大影响到系统性能。ide
StringBuilder和StringBuffer都是对对象自己进行操做的,因此不会形成性能问题。相同状况下,使用StringBuilder比StringBuffer能得到10%~15%的性能提高,但有可能会形成线程不安全问题。性能
总结String、StringBuilder和StringBuffer的使用状况:
有关String、StringBuilder和StringBuffer的相关知识就总结到这里。若有失误,请谅解,欢迎你们指正!
参考: