|
|
1
14
在爪哇中,字符串实例是不可变的。 所以,如果你这样做:
每次连接时都会创建新字符串。 另一方面,StringBuilder就像一个缓冲区,在附加新字符串时可以根据需要增长。
经验法则是(由于我得到的评论而改变): 如果要连接很多(例如,在循环中连接,或生成由多个字符串连接的变量组成的大型XML),请使用StringBuilder。否则,简单的连接(使用+操作符)就可以了。 编译器优化在编译此类代码时也扮演着重要的角色。
还有更多关于这个问题的StackOverflow问题: Is it better to reuse a StringBuilder in a loop? What's the best way to build a string of delimited items in Java? |
|
2
36
如果你结合
字面意义的
字符串(字面上
如果有两个非文本字符串并用
…Sun编译器实际生成的字节码外观 某物 这样地:
(是的,真的-请参阅本答案末尾的反汇编。)请注意,它创建了一个新的
如果需要,您可以通过重写它来显式地使用
在那里我们用了一个明确的
你可以在封面下看到这个
…拆卸(使用
注意新的
所有这些临时分配的东西听起来都很难看,但同样,只有当您处理大量循环和/或大量字符串时。此外,当结果字节码运行时,JVM可能会进一步优化它。例如,Sun的Hotspot JVM是一个非常成熟的JIT优化编译器。一旦将循环识别为热点,它很可能会找到一种重构它的方法。当然,还是不行。-)
我的经验法则是当我看到一个性能问题时,或者如果我知道我正在做一个
许多
是串联的,它是
很有可能
如果我使用
|
|
|
3
5
是的,它是相同的,但是编译器可以另外优化
字面量
在发布代码之前,所以
|
|
|
4
3
用于连接固定数量的字符串
在一个表达式中
具有
例如,生产线
产生与行相同的字节码
使用javac编译器编译时。(Eclipse编译器通过调用
如其他答案中所述,编译器将像
正如网上所提到的,你不应该使用
|
|
|
5
0
虽然可读性好,易于格式化和直截了当,但是在爪哇中用“+”连接字符串被认为是不好的。 每次通过“+”(string.concat())附加内容时,都会创建一个新字符串,复制旧的字符串内容,追加新内容,并丢弃旧字符串。字符串越大,复制的时间就越长,产生的垃圾也越多。 注: 如果您只是连接一些(比如3,4)字符串,而不是通过循环构建字符串,或者只是编写一些测试应用程序,那么仍然可以使用“+”
在执行大量字符串操作(或通过循环追加)时,将“+”替换为
还要注意的是,在Sun Java编译器中自动创建优化。
|
|
|
6
-2
|
|
|
user29759326 · 如何返回递归函数中的最后一个值? 1 年前 |
|
|
malife89 · 将java中的字符串读取为正确的日期格式 1 年前 |
|
|
Tim · 在java中,有没有更快的方法将字节数组写入文件? 1 年前 |
|
|
rudraraj · java中未声明最终变量 1 年前 |
|
|
Bala Ji · 以下BFS的实施效率如何? 1 年前 |