Sobes.tech
Junior

Какво е пул от низове в Java?

sobes.tech AI

Отговор от AI

Пулът от низове (String pool) е специална област в паметта на Java heap, където се съхраняват литералите на низове и интернираните низове. Основната му цел е спестяване на памет чрез повторна употреба на еднакви стойности на низове.

Как работи:

Когато се създаде низов литерал (например, "здравей"), JVM първо проверява дали вече съществува низ със същата стойност в пула.

  • Ако низът съществува: JVM връща препратка към вече съществуващия обект в пула, вместо да създава нов.
  • Ако низът не съществува: JVM създава нов обект String в пула и връща препратка към него.

Създаване на низове и пул:

  1. Чрез низов литерал:
    // "здравей" е низов литерал
    String s1 = "здравей";
    String s2 = "здравей";
    // s1 и s2 ще сочат към един и същ обект в пула
    
  2. Чрез конструктора new String():
    String s3 = new String("свет");
    String s4 = new String("свет");
    // s3 и s4 ще сочат към различни обекти в heap, въпреки че имат еднаква стойност.
    // Литералът "свет" може да е в пула, но обектите 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