zoukankan      html  css  js  c++  java
  • 浅析String、StringBuffer、StringBuilder的区别以及性能区别

    前奏: 比较三者之间的区别在与区别他们做相同的事情的时候的区别,那就是在我们常见的拼接字符串的时候,StringBuffer、StringBuilder调用的是appende()方法,而String很特别,是采用“+”号的方式。

    说明:如果想要搞的很清楚,建议去看看源码,写的比较清晰,并且自己测试几次。

    先看测试结果:

    测试次数 String(毫秒) StringBuffer(毫秒 StringBuilder(毫秒
    1万次   69   1   1
    10万次   5822   2   1
    20万次   22165   5   3
    30万次    53970   8   5
    50万次   186168   12   10

    结论:String > StringBuffer > StringBuilder(结果仅仅是针对我自己的这台电脑,只具有一定参考意义,并不保证完全正确)

    结果跟JDK的设计理念是一致的,当然了,本来就应该是这样的结果。

    事实上: 1.StringBuffer和StringBuilder的区别仅仅在线程安全上面,JDK源码里面显示StringBuffer的append有synchronized关键字,而StringBuilder没有,所以StringBuffer的性能肯定是弱于StringBuilder的。

         2.String和StringBuffer的差异在于,String在做字符串拼接的时候有大量的new StringBuilder操作,这对于JVM来说创建对象的开销其实是很大的,这里是性能弱点1;String内部依然是采用StringBuilder来实现的,String对象是final的,于是加上前面的很多new操作,变产生了很多垃圾,垃圾回收的开销会增加,这是性能弱点2;其实虽然说字符串操作最终都调用的是系统本地复制数组的操作,但是在调用本地方法之前String的开销很大,主要体现在String做任何操作的数组都是固定的,只能靠复制数组来解决拼接问题,所以性能是比较弱的,而StringBuffer和StringBuilder有扩容机制,也就是源码里面的扩容方法,见下面代码。

        void expandCapacity(int minimumCapacity) {
        int newCapacity = (value.length + 1) * 2;
            if (newCapacity < 0) {
                newCapacity = Integer.MAX_VALUE;
            } else if (minimumCapacity > newCapacity) {
            newCapacity = minimumCapacity;
        }
            value = Arrays.copyOf(value, newCapacity);
        }

    这里再补充一点关于JDK的扩容问题,其实StringBuffer和集合框架的扩容都设计得很好,当新增的长度大过了默认扩展容量的时候,他就把新增的长度作为基长度,之后的扩容也是基于这个基容量来扩展。如果不是这样,那如果一次性加入一万个元素,那么会扩展非常多次,这对性能的影响那是相当的大。

    以上是个人理解:仅供参考,如果有什么错误,欢迎兄弟们提出来,大家一起研究,一起进步。

  • 相关阅读:
    第一阶段冲刺总结
    读书笔记之梦断代码1
    第二次站立会议5
    第二次站立会议4
    第二次站立会议3
    第二次站立会议2
    Java学习
    项目冲刺第十天
    项目冲刺第九天
    项目冲刺第八天
  • 原文地址:https://www.cnblogs.com/dreamroute/p/3628072.html
Copyright © 2011-2022 走看看