美文网首页
String为啥比StringBuild慢很多

String为啥比StringBuild慢很多

作者: 桌面小鱼 | 来源:发表于2019-05-13 15:40 被阅读0次

    存储的时的区别.

    先来看看各自都是如何存储的

    String

    image.png

    StringBuilder

    image.png

    StringBuffer继承自AbstractStringBuilder,自身没有定义存储的容器,而是继承了其父类的容器[图片上传失败...(image-40fa51-1557732900598)]

    这个就是StringBuilder存储字符的地方

    从上面看出,String的字符是存储在一个被final修饰的char数组(类似于c中的指针常量)中的,而StringBuilder的字符是存储在一个普通的char数组中的


    运算时的区别

    String的运算

    image.png

    这两个相加的操作可以看作这样

    final char c1[] = {'第','一','个','字','符','串'};
    ​final char c2[] = {'第','二','个','字','符','串'};
    ​final char c3[] = new char[12];
    c3[] =  {'第','一','个','字','符','串','第','二','个','字','符','串'};
    ​c1 = c3;​
    //这段只做理解复制代码
    

    String在运算的时候都会创建一个大小合适的char数组[],所以当下次再拼接的时候都要进行重新分配.

    StringBuilder的运算

    image.png image.png

    StringBuilder特征

    • StringBuilder初始化容量是16(无参构造)

    • 追加之前会计算一次容量,大于所需容量则会重新创建一个char[]数组,计算规则是 newCapacity = (value.length << 1) + 2; 也就是 原来长度*2+2

    • StringBuilder在运算的时候每次会计算容量是否足够,如果所需容量不小于自身容量,那么就会重新分配一个自身容量两倍+2的char[].所以省去了很多创建char[]的次数.​

    大白话结论

    • String之所以慢是因为,大部分cpu资源都被浪费在分配资源,拷贝资源的部分了,相比StringBuilder有更多的内存消耗.

    • StringBuilder快就快在,相比String,他在运算的时候分配内存次数小,所以拷贝次数和内存占用也随之减少.

    • 由于GC的机制,即便原来的char[]没有引用了,那么也得等到GC触发的时候才能回收,String运算过多的时候就会产生大量垃圾,消耗内存.

    建议

    • 如果目标字符串需要大量拼接的操作,那么这个时候应当使用StringBuilder.

    • 反之,如果目标字符串操作次数极少,或者是常量,那么就直接使用String.

    作者:清水I
    链接:https://juejin.im/post/5cd8e76ae51d453b1f03adcb
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:String为啥比StringBuild慢很多

          本文链接:https://www.haomeiwen.com/subject/nexraqtx.html