Junior
Какво е пул от низове в Java?
sobes.tech AI
Отговор от AI
Пулът от низове (String pool) е специална област в паметта на Java heap, където се съхраняват литералите на низове и интернираните низове. Основната му цел е спестяване на памет чрез повторна употреба на еднакви стойности на низове.
Как работи:
Когато се създаде низов литерал (например, "здравей"), JVM първо проверява дали вече съществува низ със същата стойност в пула.
- Ако низът съществува: JVM връща препратка към вече съществуващия обект в пула, вместо да създава нов.
- Ако низът не съществува: JVM създава нов обект
Stringв пула и връща препратка към него.
Създаване на низове и пул:
- Чрез низов литерал:
// "здравей" е низов литерал String s1 = "здравей"; String s2 = "здравей"; // s1 и s2 ще сочат към един и същ обект в пула - Чрез конструктора
new String():String s3 = new String("свет"); String s4 = new String("свет"); // s3 и s4 ще сочат към различни обекти в heap, въпреки че имат еднаква стойност. // Литералът "свет" може да е в пула, но обектите 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