字符类型是java中比较经常使用的基本类型,使用场景非常广泛。
String常量,StringBuilder,StringBuffer是理论上的一种变量
1、执行速度:
String<StringBuffer<StringBuilder
原因:
String在java中是不可修改的(String的字符是常量,被写入了内存,如果常量集中找不到该字符串,jvm会重新创建一个新的内存对象并且返回),使用拼接运算+或者重新赋值都是JVM重新在字符集中进行查询(查找是非常耗时的)并新建一个新的对象返回给变量;
StringBuilder内置长度为13的字符数组,append等操作是在内置的对象中写入字符,长度大于13的时候再扩展字符数组的长度。在内存执行的效率上,写入总比查找快点吧(个人理解)。
StringBuffer的实现和上面类似,因为Stringbuffer和Stringbuilder都是AbstractStringBuilder的子类,区别的是Stringbuffer在继承之后重写了synchronized方法。
2.线程安全性
String和Stringbuffer是线程安全的,Stringbuilder是线程不安全的
线程安全:不是说他的一系列操作是同步的 只是对于他执行某个方法的时候不允许别的线程去改变。针对一个类来说是不是线程安全就要看,多个线程在同时在运行,这些线程可能会同时执行某个方法。但是每次运行结果和单线程执行的结果一样,那么就可以说是线程安全的。(摘录自:http://socket.blog.163.com/blog/static/20987300420107271440624/)
String是线程安全的,因为在查找过程是排他性的,在方法执行完之后其他线程才能获得这个方法的执行权,并不受JVM的调度的控制。
StringBuffer虽然是AbstractStringBuilder的子类,但是继承的方法加上了synchronized,所以也是排他性的。
Stringbuilder线程不安全一般是针对多线程中说,方法在执行过程中可以被JVM中断并使的其他线程获得控制权进行修改内置对象。
但是就线程安全的定义来说,线程安全是JVM的一种保护机制,在实际的操作中,在对于对象的多次操作和调用的过程也有可能会产生多样的结果,深入的了解可以参考上诉的链接。