String,StringBuffer 和 StringBuilder 的区别

首先,String,字符串常量,长度不可变,而StringBuffer和StringBuild作为字符串变量,值是可变的。由于这种区别,所以,但String的值改变的时候,它会检查内存中有没有相似的值,如果有,则直接拿过来,如果没有,则从新生成一个对象。如:

String str1 = "x";
String str2 = "x";

在这里,其实只生成了一个对象。再比如:

String str1 = "x";
String str2 = "y";

//另一中情况
String str1 = "x";
str1 = "y";

上面两种情形都改变了String的值(这里可以理解为 str1,str2 引用了两个不同的值?),所以都重新生成了一个对象。

 

再来看看StringBuffer,StringBuffer作为一个变量,他的值是可变的,所以不管我们有没有改变它的值,它都只生成了那一个对象。如:

//改变值
StringBuffer sb = new StringBuffer();
sb.apend("x");
sb.append("y");

//另一中情况,不改变实际值
StringBuffer sb = new StringBuffer();
sb.append("x");
sb.replace(0,1,"x");

像上面这样,不管我们有没有改变StringBuffer的值,他都不会重新生成对象,而是从新调用最开始new的那个对象。

而StringBuilder在这点上和StringBuffer是一致的。

 

StringBuffer 和StringBuilder 的区别

StringBuffer是同步的而StringBuilder是异步的,在有安全的要求下,我们只能使用StringBuffer,如果没有的话,我们就可以使用StringBuilder,因为StringBuilder的效率更高。

而在效率方面的对比,从高到底,依次是:StringBuilder > StringBuffer > String (也有人说结果更这个恰恰相反,可我没做个试验,只能个人感觉应该是这样)

 

PS:其实写下这篇随笔我的心一直在忐忑,因为我自己对这个概念也有点模糊,如果哪里有不对的地方,恳请大家指正,谢谢。







posted @ 2011-12-27 09:47  BIGBIGBIG  阅读(1420)  评论(14编辑  收藏  举报