【问题标题】:What is the cost of + operation on a String in Java?在 Java 中对 String 进行 + 操作的成本是多少?
【发布时间】:2012-01-21 17:38:45
【问题描述】:

对于这个for循环,运行时间是O(n)还是O(n^2):

char[] ar = new char[1000];
String s = "";
Arrays.fill(ar, 'a');
for(Character c: ar){
    s += c;
}

所以基本上,字符串 + 的运行时间是多少?它在 Java 中是如何在幕后工作的?

【问题讨论】:

标签: java algorithm memory runtime addition


【解决方案1】:

来自 Josh Bloch 的“Effective Java”;书中第33条:

重复使用字符串连接运算符连接n个字符串需要时间二次> in n...连接两个字符串时,复制两者的内容。

使用 StringBuilder。我相信它的性能是 O(n)。

【讨论】:

  • StringBuffer 怎么样?哪个更好?
  • 当不需要同步时,在新代码中,StrignBuilder 优于 StringBuffer。
【解决方案2】:

Java 字符串是不可变的。每次你这样做:

s+=c;

你真的是在说:

s = 新字符串(s + c);

new String(s + c) 必须分配一个长度为 s + 1 的字符串,或者:

1 2 3 4 5 6 7 8 9 ... 等等

因为 Sum(1..N) == (n + 1) (n / 2),所以这是 O(n^2)。

StringBuilder 具有明显优势的情况之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2010-11-17
    • 2011-07-08
    • 2018-02-01
    • 2013-03-20
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多