我正在阅读一本关于算法问题的热门书籍,并看到了字符串连接的实现,如下所示:
public String joinTheStrings(String[] theStrings){
String joinedString = "";
for(String singleString : theStrings){
joinedString = joinedString + singleString;
}
return joinedString;
}
然后,作者继续声称此实施是O(n^2)
,并且优化将使用StringBuffer
代替joinedString
,他们声称这将使算法成为O(n)
{ {1}}。但是,我没看到原始算法是O(n^2)
- 在我看来,对于N个单词,将有N个操作(将字符串加在一起)。
更新:感谢您的回复。看起来我很困惑作者如何处理复制一个字符数组(我认为这是一个常量)作为摊销运行时N的另一个因素?
答案 0 :(得分:3)
+
运算符用于通过在大小为String
的新char[]
中复制其两个操作数的字符来创建新的firstString.length() + secondString.length()
,但为此必须迭代超过他们两个人的角色。这就是你隐藏的内环所在。
但是,最新版本的JDK在编译时通过自动将其转换为StringBuilder
的{{1}}操作来优化字符串连接。你提到的那本书必须很旧,现在append()
一般都没用,因为它是同步的。
无论如何,编译器可能不够智能,无法在循环外部提取<{1}}实例化,为每次迭代创建新的字符串构建器,从而降低其作为性能优化的实用性。因此,手写这个并不是一个坏主意:
StringBuffer