Sobes.tech
Junior

Ինչ է Java-ում տողերի պուլը։

sobes.tech AI

Պատասխան AI-ից

String pool-ը Java-ի heap-ի (հավաք) հատուկ տարածք է, որտեղ պահվում են տողային լիտերալները և ինտերնացված տողերը: Նրա հիմնական նպատակը հիշողության խնայողությունն է՝ նույն տողային արժեքների կրկնակի օգտագործմամբ:

Ինչպես է դա աշխատում:

Երբ ստեղծվում է տողային լիտերալ (օրինակ, "hello"), JVM-ը նախ ստուգում է, արդյոք այդ արժեքով արդեն գոյություն ունի տողը պուլում:

  • Եթե կա: JVM-ը վերադարձնում է արդեն գոյություն ունեցող օբյեկտի հղումը:
  • Եթե չկա: JVM-ը ստեղծում է նոր String օբյեկտ պուլում և վերադարձնում հղումը:

Տողերի և պուլի ստեղծում:

  1. Տողային լիտերալով:
    // "hello" - դա տողային լիտերալ է
    String s1 = "hello";
    String s2 = "hello";
    // s1 և s2 հղում են նույն օբյեկտին պուլում
    
  2. new String() կոնստրուկտորով:
    String s3 = new String("world");
    String s4 = new String("world");
    // s3 և s4 հղում են տարբեր օբյեկտների, նույնիսկ եթե արժեքը նույնն է:
    // "world" լիտերալը կարող է լինել պուլում, բայց s3 և s4 - դուրս են նրանից:
    
  3. intern() մեթոդով:
    String s5 = new String("java");
    // `intern()` մեթոդը ստուգում է, արդյոք այդ արժեքով տողը արդեն կա պուլում
    String s6 = s5.intern();
    // Եթե կա, վերադարձնում է պուլում գտնվող օբյեկտի հղումը
    // Եթե չկա, ավելացնում է ներկայիս տողը պուլում և վերադարձնում հղումը:
    

Պուլում տողերի առավելությունները:

  • Հիշողության խնայողություն: Կրճատում է կրկնվող տողային օբյեկտների քանակը:
  • Ավելի լավ կատարողականություն: Տողային լիտերալների համեմատումը (==) կարող է լինել ավելի արագ, քան String օբյեկտների համեմատումը equals()-ով, եթե երկու օբյեկտներն էլ հղում են նույն օբյեկտին պուլում:

Ма կարևոր նշում:

Տողերի համեմատումը == օպերատորով ստուգում է, արդյոք երկու փոփոխականներն էլ հղում են նույն օբյեկտին հիշողության մեջ: Տողերի բովանդակության համեմատության համար միշտ օգտագործեք equals() մեթոդը:

String str1 = "abc"; // Պուլում
String str2 = "abc"; // Պուլում, նույն հղումով
String str3 = new String("abc"); // Դուրս է պուլից
String str4 = str3.intern(); // Պուլում, նույն հղումով, ինչ `str1` և `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