Daha sonra, çöp toplama işleminin gerçekleşmediğini varsayarak, bu programın kaç dizeyi üreteceği soruldu. N = 3 için düşüncelerim (7)
Dizeler 1 ( ""
) ve 2 ( "a"
), programdaki sabitlerdir, bunlar bir şeylerin parçası olarak oluşturulmaz, ancak derleyicinin bildiği sabitler oldukları için 'interned' olurlar. Wikipedia hakkında String interning adresinde bununla ilgili daha fazla bilgi bulabilirsiniz .
Bu, 5 ve 7 dizelerini sayıdan kaldırır ve "a"
Dize # 2 ile aynıdır . Bu, # 3, # 4 ve # 6 dizelerini bırakır. Yanıt, kodunuzu kullanarak "n = 3 için 3 dize oluşturulur" dır.
N sayısı 2 n = 3, bu 9 olur ve hatta olmayan enterne dizeleri doğru olsaydı sadece 7 yaşında en kötü durum cevap tarafından, cevap çünkü besbelli yanlıştır gerektiğini 2n + 1 olmuştur.
Peki, bunu nasıl yapmalısınız ?
Dize değişmez olduğu için , değiştirilebilir bir şey istiyorsunuz - yeni nesneler oluşturmadan değiştirebileceğiniz bir şey. Bu StringBuilder .
Bakılması gereken ilk şey yapıcılar. Bu durumda ipin ne kadar süreceğini biliyoruz ve bir kurucu var, StringBuilder(int capacity)
bu da tam olarak ihtiyacımız olduğu kadar tahsis ettiğimiz anlamına geliyor.
Daha sonra, "a"
bir String olması gerekmez , aksine bir karakter olabilir 'a'
. Bu, append(String)
vs append(char)
ile çağrılırken bazı küçük performans artışı sağlar append(String)
, yöntem, String'in ne kadar uzun olduğunu bulmalı ve bu konuda biraz çalışmalıdır. Öte yandan, char
her zaman tam olarak bir karakter uzunluğundadır.
Kod farklılıkları StringBuilder.append (String) ve StringBuilder.append (char) ' da görülebilir . Bu çok endişe edilecek bir şey değil , ancak işvereni etkilemeye çalışıyorsanız, mümkün olan en iyi uygulamaları kullanmak en iyisidir.
Peki, bir araya getirdiğinizde bu nasıl görünüyor?
public String foo(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append('a');
}
return sb.toString();
}
Bir StringBuilder ve bir String oluşturuldu. Staj yapmak için ekstra dizeye gerek yok.
Eclipse'de başka basit programlar yazın. Pmd'yi yükleyin ve yazdığınız kod üzerinde çalıştırın. Ne şikayet ettiğine dikkat edin ve bunları düzeltin. Bu bir döngü içinde + ile dize değişiklik bulurdum ve StringBuilder o değişirse, o olurdu belki başlangıç kapasitesi bulunan, ama kesinlikle arasındaki farkı yakalamak istiyorsunuz .append("a")
ve.append('a')