Saya kemudian ditanya berapa banyak string yang dihasilkan program ini, dengan asumsi pengumpulan sampah tidak terjadi. Pikiranku untuk n = 3 adalah (7)
String 1 ( ""
) dan 2 ( "a"
) adalah konstanta dalam program, ini tidak dibuat sebagai bagian dari hal-hal tetapi 'diinternir' karena mereka adalah konstanta yang diketahui kompiler. Baca lebih lanjut tentang ini di String magang di Wikipedia.
Ini juga menghilangkan string 5 dan 7 dari hitungan karena mereka sama "a"
dengan String # 2. Ini menyisakan string # 3, # 4, dan # 6. Jawabannya adalah "3 string dibuat untuk n = 3" menggunakan kode Anda.
Hitungan n 2 jelas salah karena pada n = 3, ini akan menjadi 9 dan bahkan dengan jawaban kasus terburuk Anda, itu hanya 7. Jika string non-magang Anda benar, jawabannya harus 2n +1.
Jadi, pertanyaan bagaimana Anda harus melakukan ini?
Karena String tidak dapat diubah , Anda menginginkan benda yang dapat berubah - sesuatu yang dapat Anda ubah tanpa membuat objek baru. Itu adalah StringBuilder .
Hal pertama yang harus dilihat adalah konstruktor. Dalam hal ini kita tahu berapa lama string akan, dan ada konstruktor StringBuilder(int capacity)
yang berarti kita mengalokasikan persis seperti yang kita butuhkan.
Selanjutnya, "a"
tidak perlu menjadi String , tetapi itu bisa berupa karakter 'a'
. Ini memiliki beberapa peningkatan kinerja kecil saat memanggil append(String)
vs append(char)
- dengan append(String)
, metode perlu mengetahui berapa lama String dan melakukan beberapa pekerjaan pada itu. Di samping itu,char
selalu tepat satu karakter.
Perbedaan kode dapat dilihat di StringBuilder.append (String) vs StringBuilder.append (char) . Ini bukan sesuatu yang terlalu diperhatikan, tetapi jika Anda mencoba mengesankan majikan, sebaiknya gunakan praktik terbaik yang ada.
Jadi, bagaimana ini terlihat ketika Anda menyatukannya?
public String foo(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append('a');
}
return sb.toString();
}
Satu StringBuilder dan satu String telah dibuat. Tidak ada string tambahan yang perlu diinternir.
Tulis beberapa program sederhana lainnya di Eclipse. Instal pmd dan jalankan pada kode yang Anda tulis. Catat apa yang dikeluhkan dan perbaiki hal-hal itu. Ini akan menemukan modifikasi dari String dengan + dalam satu lingkaran, dan jika Anda mengubah bahwa untuk StringBuilder, itu akan mungkin menemukan kapasitas awal, tapi itu pasti akan menangkap perbedaan antara .append("a")
dan.append('a')