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
minimumCapacity
mənfi olarsa, heç bir dəyişiklik baş vermir vəcurrentCapacity
yerində qalır (default olaraq 16); - əgər
currentCapacity > minimumCapacity
olarsa, heç bir dəyişiklik baş vermir vəcurrentCapacity
yerində qalır; - əgər
currentCapacity < minimumCapacity
olarsa, yeni capacity yaradılır:minimumCapacity < currentCapacity*2+2
olarsa, yeni capacitycurrentCapacity*2+2
olacaq;minimumCapacity > currentCapacity*2+2
olarsa, yeni capacityminimumCapacity
olacaq.
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; Number
class’ı final class deyil vəInteger, Long, Double
və s. wrapper classlarNumber
classının varisidirlər (onu “extends” edirlər);java.lang.System
class’ı da həmçinin final class’dır.
[topics lang=az]
Nice post.
thanks for this useful article.