String和StringBuffer的区别

来源:互联网 发布:打淘宝客服电话要钱吗 编辑:程序博客网 时间:2024/05/17 03:04
这是个老话题,在网上也看了很多帖子,现综合如下:
类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。String类提供了数值不可改变的字符串。而StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。
那么这个可变和不可变到底是什么意思呢?
请看下面的例子:
public class Test {   
   public static void stringReplace (String text) {   
   text = text.replace('j' , 'i');    
   System.out.println(text);
   }   
      
   public static void bufferReplace (StringBuffer text) {   
   text = text.append("C");    
   }   
      
    public static void main (String args[]) {    
    String textString = new String ("java");    
    StringBuffer textBuffer = new StringBuffer ("java");    
       
    stringReplace (textString);    
    bufferReplace (textBuffer);    
       
    System.out.println (textString + textBuffer);    
    }    
    }   


输出结果为:iava
javajavaC
这是因为第七行text = text.append ("C"),append方法会改变text中的值,而text与textBuffer指向的地址是相同的。因此会打印javaC.
因为Sting似是final类型的无法改变,所以在main中输出的textString的值仍为java,假设在stringReplace中text的地址为Ox0001,那么执行relpace方法后实
际上是创建了一个新的String对象,新的对象的内存地址为Ox0002,这时的text指向的地址应该是Ox0002,所以输出结果为iava。


String可以直接这样创建stringstr=”str”;而stringBuffer只能通过构造函数来创建:StringBuffer sb=new StringBuffer();StringBuffer拼接字符串时:需

要使用append()方法,而string可以直接str=str+”anotherstring”;事实上对String的修改都是创建一个新的对象。在字符串连接操作中String的连接是通过
创建一个StringBuffer对象然后再调用apend方法,最后在调用toString方法转换为String,所以连接字符串操作中StringBuffer的效率要比String高得多。
看如下例子:
将26个英文字母重复加了5000次,
        String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 5000;
        long lstart1 = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < times; i++) {
            str += tempstr;
        }
        long lend1 = System.currentTimeMillis();
        long time = (lend1 - lstart1);
        System.out.println(time);
可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
也就是46秒。
我们再看看以下代码
        String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 5000;
        long lstart2 = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < times; i++) {
            sb.append(tempstr);
        }
        long lend2 = System.currentTimeMillis();
        long time2 = (lend2 - lstart2);
        System.out.println(time2);
得到的结果为 16 有时还是 0
所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。
既然StringBuffer的效率比String的效率高那么多,为什么还要使用String呢,
在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 
对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速
度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做
原创粉丝点击