【问题标题】:Speed issue while appending strings附加字符串时的速度问题
【发布时间】:2010-01-13 09:36:13
【问题描述】:

每当我尝试在字符串中添加数字时:

String s=new String();

 for(int j=0;j<=1000000;j++)

    s+=String.valueOf(j);

我的程序正在添加数字,但速度很慢。但是当我改变我的程序并使它像这样时:

StringBuffer sb=new StringBuffer();

for(int j=0;j<=1000000;j++)

sb.append(String.valueOf(j));

我很快就得到了结果。为什么会这样?

【问题讨论】:

标签: java string performance


【解决方案1】:

s+=String.valueOf(j); 每次调用都需要分配一个新的String 对象,这很昂贵。 StringBuffer 只需要在包含的字符串太大时增加一些内部表示,这种情况发生的频率要低得多。

如果您使用 StringBuilder,它可能会更快,它是 StringBuffer 的非同步版本。

需要注意的一点是,虽然这确实适用于循环和许多其他情况,但不一定适用于使用+ 连接字符串的所有情况:

String helloWorld = getGreeting() + ", " + getUsername() + "!";

在这里,编译器可能会以它认为合适的方式优化代码,这可能会或可能不会创建StringBuilder,因为这也是一项昂贵的操作。

【讨论】:

  • +1 用于 StringBuilder。您还可以为它预先分配内存(构造函数的参数)。
【解决方案2】:

因为 s += "string" 创建了一个新实例。字符串是不可变的。 StringBuffer 或 StringBuilder 添加 String 而不创建新实例。

【讨论】:

    【解决方案3】:

    在 Java 中和在 .NET 中一样,字符串是不可变的。它们在创建后无法更改。结果是使用 + 运算符将创建一个新字符串并将两个字符串的内容复制到其中。

    StringBuffer 每次用完空间来添加字符时,都会将分配的空间加倍。从而减少内存分配量。

    【讨论】:

      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 2016-06-11
        • 2022-08-19
        • 1970-01-01
        • 2014-06-21
        • 2017-11-28
        • 1970-01-01
        • 2016-04-24
        • 2012-04-07
        • 1970-01-01
        相关资源
        最近更新 更多