该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-04
String是一个类,但却是不可变的,所以String创建的算是一个字符串常量,StringBuffer和StringBuilder都是可变的。所以每次修改String对象的值都是新建一个对象再指向这个对象。而使用StringBuffer则是对StringBuffer对象本身进行操作。所以在字符串j经常改变的情况下,使用StringBuffer要快得多。 但在某些情况下:
String S1 = “Who” + “ is” + “ faster?”; StringBuffer Stb = new StringBuilder(“Who”).append(“ is”).append(“ faster?”); S1的素对会比Stb快得多, 是因为JVM把String对象的拼接解释成了StringBuffer对象的拼接,其实在JVM就是:
String S1="Who is faster?";
不过如果,字符串是来自其他对象,如:
String s1="Who"; String s2=" is"; String s3=" faster?"; String st=s1+s2+s3;
这个时候,String的速度就比不上StringBuffer了。
StringBuffer和StringBuilder
在操作字符串对象,StringBuiler是最快的,StringBuffer次之,String最慢。
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
可以看到StringBuffer和StringBuilder都继承继承了同一个抽象类。
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。
如果要多次操作字符串,使用StringBuffer和StringBuilder会提高效率,但至少在数量级超过百万时,StringBuilder的速度才会体现出来。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-04
楼主, 别的不提, 你对String类型的理解有问题。
最好先弄清楚再发文章。 另外这个文章不像你写的? |
|
返回顶楼 | |
发表时间:2009-11-04
别卖关子了,有什么问题你说就是了,这个文章本来就不是我写!
|
|
返回顶楼 | |
发表时间:2009-11-04
berlou 写道 楼主, 别的不提, 你对String类型的理解有问题。
最好先弄清楚再发文章。 另外这个文章不像你写的? 有啥问题啊?能说一说吗? |
|
返回顶楼 | |
发表时间:2009-11-04
总结一下就是String不可变,需要操作String相当于创建新的String,性能较低。StringBuffer和StringBuilder是可变的,区别在于StringBuffer是线程安全的,性能较StringBuilder低一点~别的没什么了
|
|
返回顶楼 | |
发表时间:2009-11-05
StringBuilder 嘿嘿 , 我第一次听说 谢过
|
|
返回顶楼 | |
发表时间:2009-11-05
不是自己写的就说明是转载, 但是javaeye貌似不允许转载。
话讲回来, String问题在各个java论坛上讨论过多次了。 String a = "a" + "b". 不会被JVM解释成String a = "ab"的, 相反这个是编译时的优化, 是编译器做的, 不是JVM解释时做的, JVM解释时是严格按照程序逻辑解释的. 另外, String不可变是因为它不提供修改的接口而不是因为它本身是final的, final用在类层面上是说这个类不可扩展, 而不是这个类的内容不可变化。String本身内容不能改变是因为String类没有提供对外的接口去改变char[]的值, 而不是因为final(这个你没提到, 算我的补充吧)。 |
|
返回顶楼 | |
发表时间:2009-11-05
月×贴?~
|
|
返回顶楼 | |
发表时间:2009-11-05
我记得String的拼接 类似 Sting a="a"+"b" jvm也会临时创建一个StringBuffer对象进行操作。
|
|
返回顶楼 | |
发表时间:2009-11-05
老话重弹,不过对不了解的人也是个好的学习资料,得理解语言、编译器、JVM的区别
|
|
返回顶楼 | |