На самом деле вы должны предпочесть использовать StringBuffer или StringBuilder для таких вещей.
Однако пул строк не имеет ничего общего с обоими подходами.
Типичный вопрос, касающийся пулов строк, будет выглядеть примерно так:
String someString = new String("Shark");
How many strings will be created by the following code snippet? How many strings will exist in the string pool?
И ответ таков: будет создана только одна строка, но две строки будут существовать. Литерал "Shark"
String будет помещен в пул строк во время компиляции, а вызов конструктора создаст новый объект String во время выполнения, который будет находиться не в пуле строк, а в куче; и имеет право на сборку мусора, когда выполняются нормальные условия.
Если бы мы назвали .intern()
на нем - new String("Shark").intern()
, тогда ответ будет «только одна строка будет создана, и будет существовать только одна строка. .intern()
вернет ссылку на «Акулу» из пула строк, помещенного туда во время компиляции, и строка, созданная new String("Shark")
, будет собираться мусором, поскольку ничто больше не ссылается на нее.
Другой пример вопроса о пуле строк будет такой:
String s1 = "Shark";
String s2 = "Shark";
String s3 = new String("Shark");
String s4 = new String("Shark").intern();
System.out.println("s1 == s2 :"+(s1==s2));
System.out.println("s1 == s3 :"+(s1==s3));
System.out.println("s1 == s4 :"+(s1==s4));
What will be printed out by this code snippet?
Что, конечно, распечатает это:
s1 == s2 :true
s1 == s3 :false
s1 == s4 :true
Для полноты приведенный выше пример создаст ровно одну строку в строке pool и один в куче: один для двух идентичных литералов "Shark"
- во время компиляции, один в куче для экземпляра new String("Shark")
, а new String("Shark").intern()
вернет ссылку на литерал "Shark"
, созданный в время компиляции.
КАЖДЫЙ строковый литерал попадет в пул строк. Что-нибудь сделать с типичными вопросами пула строк.