String,是字符串常量,StringBuffer是字符串变量(线程安全);
简单的讲它们的区别在于,String是不可变对象,因此每次对Strng类型进行改变的时候,其实等于生成了一个新的String对象,然后将指针只指向的新的String对象,....因为每次声称对象都会对系统性能产生影响,对于新生成的对象,都放在Eden中;当Eden充满时(小孩太多了),VC的GC就会开始工作,那速度一定会相当慢的.
但如果使用了StringBuffer,结果就不一样了,每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用.所以一般情况下推荐使用StringBuffer,特别是字符串对象经常改变的情况下. 而在某些情况下,String对象的字符串拼接的其实是被JVM解释成StringBuffer对象的拼接,所以有些时候S听对象的速度并不会比StringBuffer对象慢,而特别是一下的字符串对象生成中,String效率是远比StringBuffer快的:
String str = "This is only a" + "simple" + "test";
StringBuffer str1= new StringBufer("This is only a").append("simple" ).append("test");
我们会惊讶的发现生成str对象的速度实在太快了,这时候StringBuffer居然速度不占优势,其实这是JVM的一个把戏,
实际上String str= "This is only a" + "simple" + "test"; 就是String str= "This is only a simple test";所以不需要太多时间了.
但是,如果字符串来自另外的String对象的话,速度也没那么快;例如;
String str2 = "This is only a";
String str3 = "simple";
String st4= "test";
String st1= "str2+str3+str4;
这时候JVM会规规矩矩按照原来的方式去做.
总而言之: 如果偶尔对字符串常量进行拼接,可以使用String,它足够简单轻量级; 如果经常对字符串进行拼接,累加操作请用StringBuffer或StringBuider;单线程环境建议用StringBuilder,因为它比Stringbuffe快r, 多线程环境用StringBuffer,它是县线程安全的;
|