Sobes.tech
Junior

Java-da sətir hovuzu nədir?

sobes.tech Süni İntellekt

AI-dan cavab

String havuzu (String pool), Java'nın yığın (heap) belleğinde özel bir alan olup, burada string literal'leri ve içe aktarılmış (interned) string'ler saklanır. Uning əsas məqsədi, eyni string dəyərlərinin təkrar istifadəsi ilə yaddaşın qənaət edilməsidir.

Necə işləyir:

Bir string literal yaradıldıqda (məsələn, "salam"), JVM əvvəlcə həmin dəyərə malik artıq stringin olub-olmadığını yoxlayır.

  • Əgər string mövcuddursa: JVM, havuzdakı mövcud obyektə istinad edir, yeni obyekt yaratmadan.
  • Əgər string mövcud deyilsə: JVM yeni String obyekti yaradır və ona istinad edir.

Stringlərin yaradılması və havuz:

  1. String literal istifadə edərək:
    // "salam" string literal'dir
    String s1 = "salam";
    String s2 = "salam";
    // s1 və s2 eyni obyektə istinad edir
    
  2. new String() konstruktoru ilə:
    String s3 = new String("dünya");
    String s4 = new String("dünya");
    // s3 və s4 fərqli obyektlərə istinad edir, baxmayaraq ki, dəyərləri eynidir.
    // "dünya" string literal poolda ola bilər, amma s3 və s4 obyektləri onun xaricindədir.
    
  3. intern() metodu ilə:
    String s5 = new String("java");
    // intern() metodu, poolda belə bir stringin olub-olmadığını yoxlayır
    String s6 = s5.intern();
    // Əgər varsa, pooldakı obyektə istinad edir.
    // Əks halda, cari stringi poola əlavə edir və ona istinad edir.
    

String havuzunun üstünlükləri:

  • Yaddaş qənaəti: Təkrarlanan string obyektlərinin sayını azaldır.
  • Performansın yaxşılaşdırılması: Literal stringlərin (==) müqayisəsi, String obyektlərinin equals() ilə müqayisəsindən daha sürətli ola bilər, əgər hər iki referans eyni obyektə işarə edirsə.

Vacib qeyd:

Stringləri == operatoru ilə müqayisə etmək, iki dəyişənin yaddaşda eyni obyektə istinad etdiyini yoxlayır. Stringlərin məzmununu müqayisə etmək üçün həmişə equals() metodundan istifadə edin.

String str1 = "abc"; // Poolda
String str2 = "abc"; // Poolda, eyni referans
String str3 = new String("abc"); // Pool xaricində
String str4 = str3.intern(); // Poolda, eyni referans, str1 və str2 ilə

System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str4); // true
System.out.println(str1.equals(str3)); // true