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