zoukankan      html  css  js  c++  java
  • String、StringBuffer、与StringBuilder的区别

      相信大家都知道StringBuffer、StringBuilder,但是这两个的用法都差不多,到底有什么区别呢,这也是面试的时候问的比较多的一道题,这里我就来说说,这两个的区别结合String来说~

      String:查看源码得知,String类的声明是:public final,所以可以很清楚的知道,fianl的话是改变不了的,所以,如果我们用String来操作字符串的时候,一旦我们字符串的值改变,就会在内存创建多一个空间来保存新的字符串,可想而知,一旦遇到复杂的操作,用String是多么低效率的事啊!

      所以,一般涉及到字符串操作的,我们一般使用StringBuffer或者StringBuilder,但是这两者都又有什么区别呢,下面我来说说:

      查看源码可以得知:

        StringBuffer和StringBuilder都集成了AbstractStringBuilder,而StringBuffer大部分方法都是synchronized,也就是线程安全的,而StringBuilder就没有,所以,我们查看API可以知道,StringBuilder可以操作StringBuffer,但是StringBuffer不可以操作StringBuilder,这也是线程的原因;

        所以,可想而知,StringBuffer的效率肯定没有StringBuilder,因为StringBuffer要维持同步锁,这肯定要消耗部分资源,下面这个例子就可以充分证明这三者之间的关系:

    package com.seven.exercise.StringTest;
    
    import org.junit.Test;
    
    public class StringBufferWithStringBuilder {
    
        public void testString() {
            long start = System.currentTimeMillis();
            String str = null;
            for (int i = 0; i < 20000; i++) {
                str = str + i + ",";
            }
            System.out.println(System.currentTimeMillis() - start);
        }
    
        public void testStringBuffer() {
            long start = System.currentTimeMillis();
    
            StringBuffer sbuf = new StringBuffer();
            for (int i = 0; i < 20000; i++) {
                sbuf.append(i + ",");
            }
            System.out.println(System.currentTimeMillis() - start);
        }
    
        public void testStringBulider() {
            long start = System.currentTimeMillis();
    
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < 20000; i++) {
                builder.append(i + ",");
            }
            System.out.println(System.currentTimeMillis() - start);
        }
    
        @Test
        public void test(){
            testString();
            testStringBuffer();
            testStringBulider();
        }
        
    }

    运行结果如下:

    1217
    9
    6

    效率:StringBuilder>StringBuffer>String,所以,如果这是考虑单线程程序的话,用StringBuilder,如果涉及到多线程的,那只能是StringBuffer,具体业务具体选择,要具体了解请查看API或者查看源码!

  • 相关阅读:
    Serverless 的初心、现状和未来
    父亲的茶杯
    子慕谈设计模式系列(三)
    子慕谈设计模式系列(二)——设计模式六大原则
    子慕谈设计模式系列(一)
    初入angular4——实际项目搭建总结
    欲练JS,必先攻CSS——前端修行之路
    运用google-protobuf的IM消息应用开发(前端篇)
    “倔驴”一个h5小游戏的实现和思考(码易直播)——总结与整理
    【猿分享第10期】微信小程序Meetup扫盲专场回顾(转载)
  • 原文地址:https://www.cnblogs.com/sevenlin/p/sevenlin_StringBuffer_StringBuilder20150806.html
Copyright © 2011-2022 走看看