【问题标题】:StringBuffer and append methodStringBuffer 和 append 方法
【发布时间】:2014-12-01 19:26:58
【问题描述】:

以下是否会降低append 方法的性能以及在append 中创建了多少String 对象?

long[] numbers = new long[20];

StringBuffer result = new StringBuffer(20);

for (int i = 0; i <= max; i++) {

    result.append(numbers[i] + " ");

}
System.out.println(result);

我的意思是如果字符串是不可变的,append 方法应该为numbers[i] 创建一个,然后为空间" " 创建另一个,将它们组合成最后一个并垃圾收集这两个?我错了吗 ?加号在这里是过度杀伤还是我应该使用以下内容:

for (int i = 0; i <= max; i++) {

    result.append(numbers[i]);
    result.append(" ");
}

【问题讨论】:

  • 你几乎回答了你自己的问题:)。第二个 sn-p 绝对是要走的路。
  • 后者会更好:)

标签: java string stringbuffer


【解决方案1】:

第一个版本实际上会被编译成这样的:

for (int i = 0; i <= max; i++) {

    result.append( new StringBuilder(numbers[i]).append(" ").toString() );

}

因此您可以看到我们在每次迭代中创建一个全新的StringBuilder,然后将其丢弃。

所以你的第二个版本要好得多,因为它只使用 1 个 StringBuffer。

我还建议您使用StringBuilder 而不是StringBuffer,因为StringBuffers 同步并且您似乎只在单个线程中使用它。

【讨论】:

  • + 用于显示生成的编译代码(我的回答很慢),+ 用于推荐使用 StringBuilder 并重点关注 StringBuffer 是同步的
【解决方案2】:

第一个比较慢。每当您创建一个新对象然后必须对其进行垃圾收集时,它都会增加一些开销并减慢您的系统速度。第二个更快——也许不是很多,但它更快——我会自己使用它而不是第一个。

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 2012-02-18
    • 2016-05-21
    • 1970-01-01
    • 2018-01-27
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多