zoukankan      html  css  js  c++  java
  • Java中的StringBuilder和StringBuffer适用场景

        我不知道为什么这个这么老的问题会出现在我的时间线上,看了一下回答,大多是2012,2013年的回答,照说那个年代,有些历史故事还很新鲜,却不知道为什么没有一个答案说到点子上。

        stringbuffer固然是线程安全的,stringbuffer固然是比stringbuilder更慢,固然,在多线程的情况下,理论上是应该使用线程安全的stringbuffer的。然而,然而,然而,有谁给我一个实际的案例来显示你需要一个线程安全的string拼接器?对不起,至少在我浅薄的十几年编程生涯中还没有遇到过,也许,仅仅是也许,这个地球上的确是存在这样的编程需求的,然而,它至少跟99.99...99%的程序员是无关的。所以,对于题主的问题,他们的适用场景是什么?最简单的回答是,stringbuffer基本没有适用场景,你应该在所有的情况下选择使用stringbuiler,除非你真的遇到了一个需要线程安全的场景,如果遇到了,请务必在这里留言通知我

        然后,补充一点,关于线程安全,即使你真的遇到了这样的场景,很不幸的是,恐怕你仍然有99.99....99%的情况下没有必要选择stringbuffer,因为stringbuffer的线程安全,仅仅是保证jvm不抛出异常顺利的往下执行而已,它可不保证逻辑正确和调用顺序正确。大多数时候,我们需要的不仅仅是线程安全,而是锁。最后,为什么会有stringbuffer的存在,如果真的没有价值,为什么jdk会提供这个类?答案太简单了,因为最早是没有stringbuilder的,sun的人不知处于何种愚蠢的考虑,决定让stringbuffer是线程安全的,然后大约10年之后,人们终于意识到这是一个多么愚蠢的决定,意识到在这10年之中这个愚蠢的决定为java运行速度慢这样的流言贡献了多大的力量,于是,在jdk1.5的时候,终于决定提供一个非线程安全的stringbuffer实现,并命名为stringbuilder。顺便,javac好像大概也是从这个版本开始,把所有用加号连接的string运算都隐式的改写成stringbuilder,也就是说,从jdk1.5开始,用加号拼接字符串已经没有任何性能损失了。

    -----------补充一个小小的修改----------
    如诸多评论所指出的,我上面说,"用加号拼接字符串已经没有任何性能损失了"并不严谨,严格的说,如果没有循环的情况下,单行用加号拼接字符串是没有性能损失的,java编译器会隐式的替换成stringbuilder,但在有循环的情况下,编译器没法做到足够智能的替换,仍然会有不必要的性能损耗,因此,用循环拼接字符串的时候,还是老老实实的用stringbuilder吧。

    作者:小猪
    链接:https://www.zhihu.com/question/20101840/answer/164866159
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    -----------再次补充----------
    个人补充: 循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。
    说明:下例中,反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行 append 操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费。
    反例:
    String str = "start";
    for (int i = 0; i < 100; i++) {
        str = str + "hello";
    }
    
  • 相关阅读:
    大数据实践解析(上):聊一聊spark的文件组织方式
    npm 项目更换目录后无法启动
    Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求
    Vue 爬坑之路(五)—— 组件进阶
    Vue 爬坑之路(四)—— 与 Vuex 的第一次接触
    Vue 爬坑之路(三)—— 使用 vue-router 跳转页面
    Vue 爬坑之路(二)—— 组件之间的数据传递
    Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目
    同步类的基础AbstractQueuedSynchronizer(AQS)
    由于不当的执行顺序导致的死锁
  • 原文地址:https://www.cnblogs.com/intTom/p/15173858.html
Copyright © 2011-2022 走看看