Strings are immutable - that means I should never use += and only StringBuffer?

前端 未结 11 1439
醉梦人生
醉梦人生 2021-01-04 08:12

Strings are immutable, meaning, once they have been created they cannot be changed.

So, does this mean that it would take more memory if you append things with += th

相关标签:
11条回答
  • 2021-01-04 08:43

    Yes, you will create a new object each time with +=. That doesn't mean it's always the wrong thing to do, however. It depends whether you want that value as a string, or whether you're just going to use it to build the string up further.

    If you actually want the result of x + y as a string, then you might as well just use string concatenation. However, if you're really going to (say) loop round and append another string, and another, etc - only needing the result as a string at the very end, then StringBuffer/StringBuilder are the way to go. Indeed, looping is really where StringBuilder pays off over string concatenation - the performance difference for 5 or even 10 direct concatenations is going to be quite small, but for thousands it becomes a lot worse - basically because you get O(N2) complexity with concatenation vs O(N) complexity with StringBuilder.

    In Java 5 and above, you should basically use StringBuilder - it's unsynchronized, but that's almost always okay; it's very rare to want to share one between threads.

    I have an article on all of this which you might find useful.

    0 讨论(0)
  • 2021-01-04 08:44

    No

    It will not use more memory. Yes, new objects are created, but the old ones are recycled. In the end, the amount of memory used is the same.

    0 讨论(0)
  • 2021-01-04 08:49

    You're right that Strings are immutable, so if you're trying to conserve memory while doing a lot of string concatenation, you should use StringBuilder rather than +=.

    However, you may not mind. Programs are written for their human readers, so you can go with clarity. If it's important that you optimize, you should profile first. Unless your program is very heavily weighted toward string activity, there will probably be other bottlenecks.

    0 讨论(0)
  • 2021-01-04 08:50

    Yes. String is immutable. For occasional use, += is OK. If the += operation is intensive, you should turn to StringBuilder.

    0 讨论(0)
  • 2021-01-04 08:54

    Rule of thumb is simple:

    If you are running concatenations in a loop, don't use +=

    If you are not running concatenations in a loop, using += simply does not matter. (Unless a performance critical application

    0 讨论(0)
  • 2021-01-04 08:54

    I agree with all the answers posted above, but it will help you a little bit to understand more about the way Java is implemented. The JVM uses StringBuffers internally to compile the String + operator (From the StringBuffer Javadoc):

    String buffers are used by the compiler to implement the binary string concatenation operator +. For example, the code:

         x = "a" + 4 + "c"
    

    is compiled to the equivalent of:

         x = new StringBuffer().append("a").append(4).append("c")
                               .toString()
    

    Likewise, x += "some new string" is equivalent to x = x + "some new string". Do you see where I'm going with this?

    If you are doing a lot of String concatenations, using StringBuffer will increase your performance, but if you're only doing a couple of simple String concatenations, the Java compiler will probably optimize it for you, and you won't notice a difference in performance

    0 讨论(0)
提交回复
热议问题