Junior
Ինչ է Java-ում տողերի պուլը։
sobes.tech AI
Պատասխան AI-ից
String pool-ը Java-ի heap-ի (հավաք) հատուկ տարածք է, որտեղ պահվում են տողային լիտերալները և ինտերնացված տողերը: Նրա հիմնական նպատակը հիշողության խնայողությունն է՝ նույն տողային արժեքների կրկնակի օգտագործմամբ:
Ինչպես է դա աշխատում:
Երբ ստեղծվում է տողային լիտերալ (օրինակ, "hello"), JVM-ը նախ ստուգում է, արդյոք այդ արժեքով արդեն գոյություն ունի տողը պուլում:
- Եթե կա: JVM-ը վերադարձնում է արդեն գոյություն ունեցող օբյեկտի հղումը:
- Եթե չկա: JVM-ը ստեղծում է նոր
Stringօբյեկտ պուլում և վերադարձնում հղումը:
Տողերի և պուլի ստեղծում:
- Տողային լիտերալով:
// "hello" - դա տողային լիտերալ է String s1 = "hello"; String s2 = "hello"; // s1 և s2 հղում են նույն օբյեկտին պուլում new String()կոնստրուկտորով:String s3 = new String("world"); String s4 = new String("world"); // s3 և s4 հղում են տարբեր օբյեկտների, նույնիսկ եթե արժեքը նույնն է: // "world" լիտերալը կարող է լինել պուլում, բայց s3 և s4 - դուրս են նրանից: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