その後、ガベージコレクションが発生しないと仮定して、このプログラムが生成する文字列の数を尋ねられました。n = 3に対する私の考えは(7)
文字列1(""
)および2("a"
)はプログラム内の定数です。これらは物の一部として作成されるのではなく、コンパイラが知っている定数であるため、「インターン」されます。詳細については、WikipediaのString interningを参照してください。
また、文字列5と7は文字"a"
列#2 と同じであるため、カウントから削除されます。これにより、ストリング#3、#4、および#6が残ります。答えは、コードを使用して「n = 3に対して3つの文字列が作成されます」です。
n個のカウント2は、N = 3で、これは9になり、さらには自分の非インターン文字列が正しい場合のみ7.だったあなたの最悪の場合の答えで、答えがあるため、明らかに間違っているはずです 2N + 1となっています。
だから、これをどのように行うべきかという質問はありますか?
Stringは不変なので、変更可能なものが必要です。これは、新しいオブジェクトを作成せずに変更できるものです。それがStringBuilderです。
最初に確認するのはコンストラクターです。この場合、文字列がどれくらいの長さになるかがわかっStringBuilder(int capacity)
ており、必要なだけ正確に割り当てることを意味するコンストラクターがあります。
次に、Stringである"a"
必要はありませんが、characterにすることができます。これは、呼び出し時に高めるいくつかのマイナーな性能がある対を-と、この方法は、文字列がどのくらい見つけると、その上のいくつかの作業を行う必要があります。一方、は常に正確に1文字の長さです。'a'
append(String)
append(char)
append(String)
char
コードの違いは、StringBuilder.append(String) vs 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();
}
1つのStringBuilderと1つのStringが作成されました。追加の文字列をインターンする必要はありません。
Eclipseで他のいくつかの簡単なプログラムを作成します。pmdをインストールし、作成したコードで実行します。文句を書き、それらを修正します。これは、ループ内で+付き文字列の変更を発見しただろう、とあなたはStringBuilderのにそれを変更した場合、それはいるだろう多分初期容量を見つけたが、それは確かに違いをキャッチだろう.append("a")
し、.append('a')