Sobes.tech
Junior

Kas yra eilutinių duomenų baseinas Java?

sobes.tech AI

Atsakymas iš AI

Eilutiniųjų saugykla (String pool) yra speciali atminties sritis Java kalbos heap'e, kurioje saugomos eilutės literalai ir interniuotos eilutės. Jos pagrindinis tikslas — taupyti atmintį, pakartotinai naudojant tas pačias eilutės reikšmes.

Kaip tai veikia:

Kai sukuriamas eilutės literalas (pavyzdžiui, "hello"), JVM pirmiausia patikrina, ar jau egzistuoja tokia reikšmė eilutės saugykloje.

  • Jei egzistuoja: JVM grąžina nuorodą į jau esantį objektą saugykloje, nesukuriant naujo.
  • Jei neegzistuoja: JVM sukuria naują String objektą saugykloje ir grąžina nuorodą į jį.

Eilutės ir saugyklos kūrimas:

  1. Naudojant eilutės literalą:
    // "hello" yra eilutės literalas
    String s1 = "hello";
    String s2 = "hello";
    // s1 ir s2 nuorodos į tą patį objektą saugykloje
    
  2. Naudojant new String() konstruktorių:
    String s3 = new String("world");
    String s4 = new String("world");
    // s3 ir s4 nuorodos į skirtingus objektus, net jei reikšmės yra tokios pačios.
    // Eilutės literalas "world" gali būti saugykloje, bet s3 ir s4 — ne.
    
  3. Naudojant intern() metodą:
    String s5 = new String("java");
    // `intern()` metodas patikrina, ar tokia reikšmė jau yra saugykloje
    String s6 = s5.intern();
    // Jei yra, grąžina nuorodą į saugyklos objektą
    // Jei nėra, prideda dabartinį eilutės objektą į saugyklą ir grąžina nuorodą
    

Sauggyklos privalumai:

  • Taupymas: sumažina dubliuotų eilutės objektų skaičių.
  • Veikimo spartinimas: palyginimas pagal literalus (==) gali būti greitesnis nei String objektų palyginimas equals(), jei abu operandai nurodo tą patį objektą saugykloje.

Svarbu:

Palyginimas eilutėmis operatoriumi == patikrina, ar dvi kintamosios nurodo tą patį objektą atmintyje. Norint palyginti eilutės turinį, visada naudokite equals() metodą:

String str1 = "abc"; // saugykloje
String str2 = "abc"; // saugykloje, ta pati nuoroda
String str3 = new String("abc"); // už saugyklos ribų
String str4 = str3.intern(); // saugykloje, ta pati nuoroda kaip ir `str1` ir `str2`

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