验证String、StringBuffer、StringBuilder区别

1、线程安全概念

线程安全指的是多个线程并发执行的时候,当一个线程访问该类的某个数据的时候,通过加锁的机制,保护数据,

直至当前线程读取完,释放锁后,其他线程才能继续使用,我们认为这样是线程安全的。

2、验证String、StringBuffer、StringBuilder区别

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数
据这个String类提供了数值不可改变字符串而这个StringBuffer类提供的字符串进行修改当你知道字
符数据要改变的时候你就可以使用StringBuffer典型地,你可以使用StringBuffers来动态构造字符数据 

String 类型和StringBuffer的主要性能区别:String是不可变的对象,因此在每次对String类型进行改变
的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的
字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多
了以后, JVM 的 GC 就会开始工作,性能就会降低。 

StringBuilder是一个可变的字符序列,是JDK5.0新增的。此类提供一个与StringBuffer兼容的API,但不
保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候
(这种情况很普遍)。 

例如:

public static void main(String[] args) {
       String();
       StringBuffer();
       StringBuilder();
    }
    private static void String(){
        long start=System.currentTimeMillis();
        String str="a";
        for (int i = 0; i < 10000; i++) {
            str+=i;
        }
        long stop=System.currentTimeMillis();
        System.out.println("String time:"+(stop-start));
    }
    private static void StringBuffer(){
        long start=System.currentTimeMillis();
        StringBuffer str=new StringBuffer("a");
        for (int i = 0; i < 10000; i++) {
            str.append(i);
        }
        long stop=System.currentTimeMillis();
        System.out.println("StringBuffer time:"+(stop-start));
    }
    private static void StringBuilder(){
        long start=System.currentTimeMillis();
        StringBuilder str=new StringBuilder("a");
        for (int i = 0; i < 10000; i++) {
            str.append(i);
        }
        long stop=System.currentTimeMillis();
        System.out.println("StringBuilder time:"+(stop-start));
    }

 结果:

此方法要在数值比较大的时候才好验证。

在大部分情况下,StringBuilder > StringBuffer。这主要是由于前者不需要考虑线程安全。

例如:

public static void main(String[] args) {
        long a=100000;
        {
            List<Thread>li=new ArrayList<Thread>();
            StringBuffer sb=new StringBuffer("a");
            for (int i = 0; i < a; i++) {
                Thread tr=new Thread(){
                    @Override
                    public void run() {
                        sb.append(".");
                    }
                };
                tr.start();
                li.add(tr);
            }
            for (Thread item:li) {
                try {
                    item.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("lengthOne="+sb.length());
        }
        //===================================
        {
            List<Thread>li=new ArrayList<Thread>();
            StringBuilder sb=new StringBuilder("a");
            for (int i = 0; i < a; i++) {
                Thread tr=new Thread(){
                    @Override
                    public void run() {
                        sb.append(".");
                    }
                };
                tr.start();
                li.add(tr);
            }
            for (Thread item:li) {
                try {
                    item.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("lengthTne="+ sb.length());
        }
    }

结果:

原文地址:https://www.cnblogs.com/ljj5/p/9470593.html