然后我被问到这个程序将生成多少个字符串,假设不会发生垃圾回收。我对n = 3的想法是(7)
字符串1(""
)和2("a"
)是程序中的常量,它们不是作为事物的一部分创建的,而是被“ interned”的,因为它们是编译器知道的常量。在Stringped in Wikipedia上了解有关此内容的更多信息。
这也会从计数中删除字符串5和7,因为它们与"a"
字符串#2 相同。这样就留下了字符串#3,#4和#6。答案是使用您的代码“为n = 3创建了3个字符串”。
N的计数2显然是错误的,因为在n = 3,这将是9,甚至你的最坏情况下的答案,这只是7.如果你非实习字符串是正确的,答案应该已经2N + 1。
所以,问题是如何应该这样做?
由于String是不可变的,因此您需要一个可变的东西-无需创建新对象即可更改的东西。那就是StringBuilder。
首先要看的是构造函数。在这种情况下,我们知道字符串将有多长,并且有一个构造函数StringBuilder(int capacity)
,这意味着我们将完全分配所需的数量。
接下来,"a"
不必是String,而可以是character 'a'
。这有一些小的性能打电话时提高append(String)
VS append(char)
-同append(String)
,该方法需要找出字符串是如何长,做一些工作。另一方面,char
总是正好一个字符长。
可以在StringBuilder.append(String)与StringBuilder.append(char)处看到代码差异。不必太在意,但是如果您想打动雇主,最好使用最佳实践。
那么,当您将其放在一起时,外观如何?
public String foo(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append('a');
}
return sb.toString();
}
已创建一个StringBuilder和一个String。无需插入额外的字符串。
在Eclipse中编写其他一些简单程序。安装pmd并在您编写的代码上运行它。注意它抱怨什么并修复这些问题。它将发现在一个循环中用+修改了一个String,如果将其更改为StringBuilder,它可能会找到初始容量,但肯定会捕捉到.append("a")
和之间的区别。.append('a')