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