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