String、StringBuffer和StringBuilder之间最大的区别是String是不可变的对象,而StringBuffer和StringBuilder是可变对象。不可变的意思是【不可变的机制和好处】存储在对象中的值是不变的,下一个问题是:“如果对象是不可变的那么当我想改变对象的内容的时候怎么去更改呢?”准确的说更改后的String对象和更改前的String对象并不是同一个对象。
假设你声明了下边一个String对象:
String myString = "hello";
下一步你想在同一个String对象里添加“Guest”,你怎么做呢
myString = myString + ” Guest”;
当你打印myString的内容的时候输出的是“Hello Guest”.尽管我们使用的是同一个对象(mySting),在内部却是创建了新的对象,所以,如果对String做类似的操作,比如append、trim等修改String对象的,你实际就是创建了String的新对象。
现在的问题是,这样会导致性能问题吗,答案是肯定的。那么如何使String操作更有效率呢,那就是通过使用StringBuffer和StringBuilder。
因为StringBuffer和StringBuilder对象是可变的,我们可以对存储在对象中的一些值做些改变。这里的有效的意思是和String相比使用StringBuffer和StringBuilder在一些像append等操作上会更有效。
那么StringBuffer和StringBuilder之间又有什么区别呢?
StringBuffer和StringBuilder有着相同的方法,但是StringBuffer是同步的而StringBuilder不是同步的,所以如果你不想使用线程那么使用StringBuilder会更有效(因为这少了同步的开支)。
怎么使用StringBuilder:
首先看看String的方式:
String s = “Hello”;
s = s + ” World”;
system.out.println(s);
StringBuilder sb = new StringBuilder(“Hello”);
sb.append(” World”);
system.out.println(sb);
下边再运行一个例子来展示String对象是不可变的,来看看下边的代码:
package com.other.test;
public class StringTest {
public static void main(String[] args) {
String s = "来一个测试";
s.concat("如果是同一个对象,这句话要输出!");
System.out.println(s);
s = s.concat("如果只输出这句就证明了String是不可变的");
System.out.println(s);
}
}
输出的结果是:
来一个测试
如果只输出这句就证明了String是不可变的
上边的代码证明了String是不可变的,因此像concat这样操作执行的结果是值存储在了新的对象中。
补充一点的是:StringBuilder是java1.5引进来的(如果你是之前的版本那么只能使用StringBuffer)。
关于他们的对比还有两篇好文章:
http://kaioa.com/node/59
http://stackoverflow.com/questions/2971315/string-stringbuffer-and-stringbuilder
展示String是不可变对象的图解:http://www.programcreek.com/2009/02/diagram-to-show-java-strings-immutability/
为什么String是不可变对象:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/