Junior
Java-ში String Pool-ის რა მიზანია?
sobes.tech AI
პასუხი AI-სგან
Java-да String Pool აუცილებელია შემდეგისთვის:
- მეხსიერების დაზოგვა: თავიდან აიცილებს დუბლიკატების შექმნას სტრინგ ლიტერალებში. თუ იგივე მნიშვნელობის სტრინგი უკვე არსებობს პულში, გამოიყენება მისამართი მისთვის.
- შესრულების ოპტიმიზაცია: სტრინგ ლიტერალების შედარება (
==) ხდება სწრაფად, რადგან შედარება ხდება მისამართების მიხედვით, არა სტრინგების შიგთავსზე.
სტრინგ ლიტერალების შექმნისას (String s = "hello";), JVM პირველ რიგში ამოწმებს String Pool-ს. თუ "hello" უკვე არსებობს, s მითითებულია არსებულ ობიექტზე. თუ არა, ახალი "hello" ობიექტი შეიქმნება პულში და s მისამართს მიენიჭება.
new String("hello") კონსტრუქტორი ყოველთვის ქმნის ახალ String ობიექტს heap-ზე, დამოუკიდებლად პულიდან. მის დასამატებლად პულში, საჭიროა intern() მეთოდის გამოძახება.
// String Pool-ის მუშაობის მაგალითი
String s1 = "hello"; // ამოწმებს პულს, საჭიროების შემთხვევაში ქმნის, მიენიჭება პულს
String s2 = "hello"; // ამოწმებს პულს, პოულობს არსებულს, მიენიჭება პულს
System.out.println(s1 == s2); // true - მისამართები ერთნაირია
String s3 = new String("hello"); // ქმნის ახალ ობიექტს heap-ზე
System.out.println(s1 == s3); // false - მისამართები განსხვავებულია
String s4 = s3.intern(); // ამოწმებს პულს s3-ის შიგთავსისთვის.
// რადგან "hello" უკვე პულშია (s1/s2),
// s4 მიენიჭება პულში არსებული ობიექტი.
System.out.println(s1 == s4); // true - s1 და s4 ერთნაირ ობიექტს მიენიჭება