当前位置 博文首页 > 张孟浩_jay的博客:第六篇:Java之String、StringBuilder、Strin

    张孟浩_jay的博客:第六篇:Java之String、StringBuilder、Strin

    作者:[db:作者] 时间:2021-09-12 12:07

    String是Java中最基础的类,我们在上一篇详细介绍了String。

    for(int i = 0;i < 10;i++){
        str+=i;
    }
    

    1、StringBuilder和String的区别
    如上面代码所示,
    a、String 因为String是final类,也就是不可以被修改,为什么会这么做呢?因为程序中对于String的读取是很频繁的,将String修饰为final后,相当于String是只读的,访问的时候不需要做限制和加锁。
    所以,当执行上述代码时,会新建10个新的String,然后将指针赋予str引用,这样的耗费很大。

    b、StringBuilder就是一个可以动态增加的类,通过StringBuilder.append()来动态添加字符串。实现的原理是对char数组动态扩容,从始至终就只有一个对象。动态扩容的花销是小于新建String的。

    随着JDK的升级,JVM会对str+= 会自动转化为StringBuilder来添加。

    2、StringBuilder和StringBuffer的区别:
    StringBuilder是线程不安全的,StringBuffer是线程安全的。

    你可能心想StringBuilder怎么会线程不安全呢?
    我给你举一个例子:
    比如A和B两个线程同时调用A.append(c1),B.append(c2);
    append方法的大概逻辑:
    1、首先获取当前StringBuilder的长度idx
    2、设置char数组arr下标索引为idx的char为c,即arr[idx] = c;
    3、idx++;

    有一定的概率,二者同时读取idx,然后A设置arr[idx]=c1,B设置arr[idx]=c2。这样的话就相当于A的append丢失了,就造成了线程的不安全。

    StringBuffer通过引入锁synchronized,解决了这一问题!但是性能会下降,加锁会造成额外的开销。所以单线程的环境的话,还是推荐使用StringBuilder

    cs