Java高级篇-4-StringBuffer和StringBuilder

来源:互联网 发布:s60v2软件 编辑:程序博客网 时间:2024/06/16 13:18

        前面一篇,我们介绍了String这个类,其中String类提供的一些方法中有些方法是基于StringBuffer实现的。在Java中如果涉及到频繁的字符串修改操作,建议采用StringBuilder和StringBuffer,肯定不用String类。肯定有人会问,StringBuilder和StringBuffer有什么区别呢?这个在面试中也经常被问道。就一句话,StringBuffer和StringBuilder的方法基本上是一样的,唯一的区别是StringBuffer是线程安全的,而StringBuilder不是。

        StringBuilder和StringBuffer和String不一样,Stirng是不可变化的。但是StringBuilder和StringBuffer它不是final的,可以修改。字符串最常见的操作就是添加和删除。这里写一个程序分别用String类和StringBuilder和StringBuffer,三种方法来对字符串添加的操作。看看分别耗时多少,而且前面一段提到StringBuilder不是线程安全,StringBuffer是线程安全。线程我们暂时不管,后面学习。线程安全,意味着有代价,那就是要慢一些。下面的例子,可以证明三种类对字符串添加操作的速度快慢对比。

package demo3;/** * create by Anthony on 2017/10/29 */public class StringBufferDemo {    private static final int ITERATIONS = 100000;   // 参考StringBuffer.java中的 initial capacity of 16 characters.    private static final int BufferSize = 16;    private void concatString(){        System.out.print("comcatString -> ");        long startTime = System.currentTimeMillis();        String concat = "";        for(int i = 0; i< ITERATIONS; i++){            concat += i % 10;        }        long endTime = System.currentTimeMillis();        System.out.print("length: "+ concat.length());        // 统计循环整个过程时间       System.out.println(" time: "+ (endTime - startTime));    }    //StringBuffer    private void concatStringBuffer(){        System.out.print("concatStringBuffer -> ");        long startTime = System.currentTimeMillis();        StringBuffer concat = new StringBuffer();        for(int i=0; i< ITERATIONS; i++){            concat.append(i % 10);        }        long endTime = System.currentTimeMillis();        System.out.print("length: "+ concat.length());        System.out.println(" time: "+ (endTime - startTime));    }    //StringBuilder    private void concatStringBuilder(){        System.out.print("concatStringBuilder -> ");        long startTime = System.currentTimeMillis();        StringBuilder concat = new StringBuilder();        for(int i=0; i< ITERATIONS; i++){            concat.append(i % 10);        }        long endTime = System.currentTimeMillis();        System.out.print("length: "+ concat.length());        System.out.println(" time: "+ (endTime - startTime));    }    public static void main(String args[]){        String str = new String("Hello ");        str += "BeiJing";        StringBuffer strb = new StringBuffer("Hello ");        strb.append("BeiJing");        StringBuilder strd = new StringBuilder("Hello ");        strd.append("BeiJing");        StringBufferDemo st = new StringBufferDemo();        System.out.println("Iterations:" + ITERATIONS);        System.out.println("Buffer:" + BufferSize);        st.concatStringBuffer();        st.concatString();        st.concatStringBuilder();    }}

运行结果:

Iterations:100000Buffer:16concatStringBuffer -> length: 100000 time: 16comcatString -> length: 100000 time: 4859concatStringBuilder -> length: 100000 time: 4

       结论就是,从操作效率来看:StringBuilder > StringBuffer > String。 所以,如果不考虑线程安全角度,尽量多用StringBuilder来操作字符串的修改。

原创粉丝点击