Nümunə 1:
String s = "";
for(char current='a'; current<='z'; current++)
s += current;
System.out.println(s);
Nümunə 2:
StringBuilder sb = new StringBuilder();
for(char current='a'; current<='z'; current++)
sb.append(current);
System.out.println(sb);
Nümunə 1 və Nümunə 2 mahiyyət baxımından ikisi də demək olar ki, eyni işi görür. Amma fərq ondadır ki, String dəyişəni immutable dəyişəndir və ona görə də 1-ci nümunədə hər dəfə concatenation əməliyyatı yerinə yetirildikdə yeni obyekt yaradılır və köhnə dəyər artıq garbage collection üçün silinməyə namizəd (eligible) obyekt hesab olunur (təxminən 27 obyekt yaradılır və əksəri “eligible” olur).
StringBuilder mutable`dir və ona görə də ikinci nümunədə cəmi bir obyekt yaradılır, hər append() metodundan sonra sadəcə dəyəri dəyişir.
String dəyərini StringBuilder‘ə mənimsətmək olmaz:
StringBuilder sb = "StringBuilder"; // DOES NOT COMPILE
Creating a StringBuilder
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder("animal");
StringBuilder sb3 = new StringBuilder(10);
StringBuilder sb4 = new StringBuilder(-5); // throws NegativeArraySizeException
sb3 referansında 10 capacity‘ni göstərir, length‘ı deyil. Capacity obyektin özündə nə qədər simvol tutub saxlaya biləcəyini göstərir. String immutable olduğundan onun üçün length və capacity eynidir. Amma StringBuilder'ə yeni simvollar əlavə olunduqca capacity avtomatik olaraq genişlənir. StringBuilder yaradılarkən capacity təyin edilməyibsə, default olaraq 16‘dan başlayır.
System.out.println(sb3.length()); // output: 0 System.out.println(sb3.capacity()); // output: 10
Capacity`ni artırmaq üçün ensureCapacity(int minimumCapacity) metodundan istifadə edilir. Göndərilən parametrdən asılı olaraq fərqli nəticələr meydana çıxır:
- əgər
minimumCapacitymənfi olarsa, heç bir dəyişiklik baş vermir vəcurrentCapacityyerində qalır (default olaraq 16); - əgər
currentCapacity > minimumCapacityolarsa, heç bir dəyişiklik baş vermir vəcurrentCapacityyerində qalır; - əgər
currentCapacity < minimumCapacityolarsa, yeni capacity yaradılır:minimumCapacity < currentCapacity*2+2olarsa, yeni capacitycurrentCapacity*2+2olacaq;minimumCapacity > currentCapacity*2+2olarsa, yeni capacityminimumCapacityolacaq.
StringBuilder sb = new StringBuilder(); System.out.println(sb.capacity()); // 16 sb.ensureCapacity(-10); // 16 sb.ensureCapacity(10); // 16 sb.ensureCapacity(20); // 34 sb.ensureCapacity(71); // 71
StringBuilder vs. StringBuffer
StringBuilder StringBuffer‘ə nisbətən Java’ya sonradan əlavə olunub. Demək olar ki, eyni işi görürlər, amma StringBuffer "thread safe” olduğundan daha yavaş işləyir.
StringBuffer imtahan mövzusuna daxil deyil, sadəcə yadınızda saxlaya bilərsiniz ki, StringBuilder kimi eyni metodlara malikdir. String, StringBuilder və StringBuffer hər üçü final class`dır. Ümumiyyətlə, final class`lar ilə bağlı əlavə olaraq aşağıdakıları bilməyinizdə də fayda var:
- Wrapper class’lar (
Boolean, Integer, Long, Short, Byte, Character, Float, Double) final class’lardır və onlardan varis almaq mümkün deyil; Numberclass’ı final class deyil vəInteger, Long, Doublevə s. wrapper classlarNumberclassının varisidirlər (onu “extends” edirlər);java.lang.Systemclass’ı da həmçinin final class’dır.
[topics lang=az]

Nice post.
thanks for this useful article.