String、StringBuffer和StringBuilder的区别
String:字符串常量 。StringBuffer 与 StringBuilder是字符缓冲变量。StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer中的方法大都采用了synchronized 关键字进行修饰,因此是线程安全的,而StringBuilder没有这个修饰,可以被认为是线程不安全的。StringBuilder 是在JDK1.5才加入的。jdk的实现中StringBuffer与StringBuilder都继承自AbstractStringBuilder。
2、StringBuilder和StringBuffer类型的字符串是可变的,不同的是StringBuffer类型的是线程安全的,而StringBuilder不是线程安全的
3、如果是多线程环境下涉及到共享变量的插入和删除操作,StringBuffer则是首选。如果是非多线程操作并且有大量的字符串拼接,插入,删除操作则StringBuilder是首选。毕竟String类是通过创建临时变量来实现字符串拼接的,耗内存还效率不高,怎么说StringBuilder是通过JNI方式实现终极操作的。
4、StringBuilder和StringBuffer的“可变”特性总结如下:
(1)append,insert,delete方法最根本上都是调用System.arraycopy()这个方法来达到目的
(2)substring(int, int)方法是通过重新new String(value, start, end - start)的方式来达到目的。因此,在执行substring操作时,StringBuilder和String基本上没什么区别。 总的来说,三者在执行速度方面的比较:StringBuilder > StringBuffer > String。
String s = "abcd";JVM执行上边的代码的时候,第一行代码在栈创建了一个s对象引用指向在堆区创建的字符对象"abcd",在执行第二行代码时候,会在堆区再创建一个字符对象"abcdab",s的引用指向了这个新创建的对象实例。原来的字符对象依然存在,所以说它不能改变。在堆区的无用的字符对象会等待JVM的GC,所以其执行速度会很慢。
s = s+"ab";
System.out.print(s);// result : abcdab
一个特殊的例子
String str = "This is only a" + "simple" + "test";上边的例子会发现str的生成速度很快,这其实是JVM把戏。
StringBuffer builder = new StringBuilder("This is only a").append("simple").append("test");
String str = "This is only a" + "simple" + "test";其实就是:
String str = "This is only a simple test"所以不需要太多的时间了。但如果你的字符串是来自另外的String对象的话,JVM就会像上边一样执行了。