Sobes.tech
Junior

Kas ir Java virkņu baseins?

sobes.tech AI

Atbilde no AI

String pool ir īpaša atmiņas zona Java heap'ā, kurā tiek glabāti string literal un internēti string objekti. Tā galvenais mērķis ir taupīt atmiņu, atkārtoti izmantojot vienas un tās pašas string vērtības.

Kā tas darbojas:

Kad tiek izveidots string literals (piemēram, "hello"), JVM vispirms pārbauda, vai šāda vērtība jau pastāv string pool.

  • Ja pastāv: JVM atgriež atsauci uz jau esošo objektu pool, neizveidojot jaunu.
  • Ja nepastāv: JVM izveido jaunu String objektu pool un atgriež atsauci uz to.

Stringu un poola izveide:

  1. Ar string literal:
    // "hello" ir string literals
    String s1 = "hello";
    String s2 = "hello";
    // s1 un s2 norāda uz to pašu objektu pool
    
  2. Ar new String() konstruktoru:
    String s3 = new String("world");
    String s4 = new String("world");
    // s3 un s4 norāda uz dažādiem objektiem, pat ja vērtība ir vienāda.
    // String literals "world" var būt pool, bet s3 un s4 — ārpus tā.
    
  3. Ar intern() metodi:
    String s5 = new String("java");
    // intern() pārbauda, vai šāda vērtība jau ir pool
    String s6 = s5.intern();
    // Ja ir, atgriež atsauci uz pool objekta
    // Ja nav, pievieno pašreizējo stringu pool un atgriež atsauci uz to
    

Pool priekšrocības:

  • Atmiņas taupīšana: Samazina dublēto string objektu skaitu.
  • Veiktspējas uzlabošana: Pārbaude ar literaliem (==) var būt ātrāka nekā String objektu salīdzināšana ar equals(), ja abi operandi norāda uz to pašu objektu pool.

Svarīgi:

== operatora salīdzinājums pārbauda, vai abas mainīgās norāda uz to pašu objektu atmiņā. Lai salīdzinātu string saturu, vienmēr izmantojiet equals() metodi:

String str1 = "abc"; // pool
String str2 = "abc"; // pool, tā pati atsauce
String str3 = new String("abc"); // ārpus pool
String str4 = str3.intern(); // pool, tā pati atsauce kā `str1` un `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