V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
liqingcan
V2EX  ›  问与答

关于 Java 的 toString 方法 StringBuffer 和直接用+号的一些想法

  •  
  •   liqingcan · Mar 11, 2017 · 4078 views
    This topic created in 3340 days ago, the information mentioned may be changed or developed.

    今天看博客有瞄到一句 QQ 截图 20170311150320.png 就是说,在大量使用字符串连接的时候用+号浪费性能,推荐使用 StringBuffer 的方式。这个挺早之前就经常看到有这么说的。但是,今天突然有个想法,既然用+号会浪费性能,那么,我们经常用 eclipse 或者 idea 来重写一个 javabean 的 toString 方法时,为什么都是用的+号的形式? QQ 截图 20170311150123.png 既然编辑器有提供帮我们写的工能,为什么编辑器不选择一个更有效率的办法?

    我猜测是因为 toString 基本是在开发调试阶段使用,在正常业务逻辑中基本不会用到,所以也就不去在乎这一点了。

    6 replies    2017-03-11 18:24:19 +08:00
    freelee
        1
    freelee  
       Mar 11, 2017
    idea 这么提示,是因为你所用版本的 jvm ,会在编译的时候把这种简单的+连接改成 stringbuilder 拼接吧
    http://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java
    ob
        2
    ob  
       Mar 11, 2017 via Android
    因为正常的 toString 很少超过 10 的吧,你试下 10 个以内两个的时间差。。
    SoloCompany
        3
    SoloCompany  
       Mar 11, 2017
    你看的是历史书,估计是 java 1.0 年代时候的事情
    xialdj
        4
    xialdj  
       Mar 11, 2017 via iPhone
    都已经不推荐用 stringbuffer 了 你这个书已经老了
    CYKun
        5
    CYKun  
       Mar 11, 2017 via Android
    一个很简单的规则是,在循环里面的用 StringBuilder ,不在循环里面的就用加号。 Java8 之后还可以用 joining 收集器。
    orcusfox
        6
    orcusfox  
       Mar 11, 2017
    首先 要用 StringBuilder
    第二 对于循环内的+号操作, jvm 会编译成每个循环 new 一个 StringBuilder ,然后 append ,然后把原来的 string 对象用这个临时变量的 toString 代替,个人感觉优化效果不大
    所以 如果循环多 要在循环外面 new 一个 StringBuilder 然后在循环里面 append
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   863 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 18:49 · PVG 02:49 · LAX 11:49 · JFK 14:49
    ♥ Do have faith in what you're doing.