java中的String与StringBuffer

来源:互联网 发布:长城网络还原大师2009 编辑:程序博客网 时间:2024/06/18 17:25

两者的区别

      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<times; ++i){str += "lsj";}long end = System.currentTimeMillis();System.out.println((end-start) + "ms");}}
需要时间: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<times; ++i){str.append("lsj");}long end = System.currentTimeMillis();System.out.println((end-start) + "ms");}}

时间几乎为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