• 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或者查看源码!

  • 相关阅读:
    最详解JavaScript常见的创建对象的七种方式(推荐)
    详解数组的迭代方法every()、filter()、forEach()、map()以及some()的用法
    详解数组的concat()、slice()、splice()方法
    解决微信小程序中web-view无法调用微信支付
    SQLAlchemy_定义(一对一/一对多/多对多)关系
    常用算法
    Python框架之Tornado (源码之褪去模板外衣)
    Python框架之Tornado(源码之褪去模板外衣的前戏)
    Python框架之Tornado(请求)
    Python框架之Tornado(请求阶段)
  • 原文地址:https://www.cnblogs.com/sevenlin/p/sevenlin_StringBuffer_StringBuilder20150806.html
Copyright © 2020-2023  润新知