OCA Java imtahan mövzuları

StringBuilder Class

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ə 1Nü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 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:

  1. əgər minimumCapacity mənfi olarsa, heç bir dəyişiklik baş vermir və currentCapacity yerində qalır (default olaraq 16);
  2. əgər currentCapacity > minimumCapacity olarsa, heç bir dəyişiklik baş vermir və currentCapacity yerində qalır;
  3. əgər currentCapacity < minimumCapacity olarsa, yeni capacity yaradılır:
    • minimumCapacity < currentCapacity*2+2 olarsa, yeni capacity currentCapacity*2+2 olacaq;
    • minimumCapacity > currentCapacity*2+2 olarsa, yeni capacity minimumCapacity 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:

  1. Wrapper class’lar (Boolean, Integer, Long, Short, Byte, Character, Float, Double) final class’lardır və onlardan varis almaq mümkün deyil;
  2. Number class’ı final class deyil və Integer, Long, Double və s. wrapper classlar Number classının varisidirlər (onu “extends” edirlər);
  3. java.lang.System class’ı da həmçinin final class’dır.

 

[topics lang=az]

About the author

Mushfiq Mammadov

1 Comment

Leave a Comment


The reCAPTCHA verification period has expired. Please reload the page.

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.