两者的区别
java中的String是final类,不能被继承。String是不可变对象,一旦创建就不能改变。对于已经存在String对象我们要去修改都是要创建一个新的对象,然后把新的值保存进去。
例如:String s1 = new String();
String s2 = new String();
s1 += s2;//该操作,先要新开辟一块存储区域,将s1和s2合并,再将这个地址传给s1引用。那么s1原来空间就被自动回收掉了。
java中的StringBuffer是一个可变对象,改变的时候,直接在原地址后面修改。StringBuffer只能通过构造函数来建立。
StringBuffer str = new StringBuffer();
str = "lsj";//错误,不能通过这种方式赋值
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null,向StringBuffer中赋值的时候可以通过它的append方法.
str.append("seu");
StringBuffer s1 = new StringBuffer();
String s2 = new StringBuffer();
s1.append(s2);//该操作直接在s1的空间后面操作,不需要开辟额外的空间。
做下面一个实验
public class testString
{
public static void main(String args[]){
String str = new String();
long start = System.currentTimeMillis();
final int times = 1000;
for(int i=0; i
需要时间:15ms
而同样代码用StringBuffer做:
public class testString
{
public static void main(String args[]){
StringBuffer str = new StringBuffer();
long start = System.currentTimeMillis();
final int times = 1000;
for(int i=0; i
时间几乎为0.真正原因
其实,我们对
String s1 = new String();
String s2 = new String();
s1 += s2;
代码做连接操作的时候,系统其实按照下面代码来做的:
StringBuffer tempStr = new StringBuffer(s1);
tempStr.append(s2);
s1 = tempStr.toString();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣。并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值,这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的。
总结:如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高
参考:http://blog.csdn.net/yirentianran/article/details/2871417