Во-первых, да, пул строк и содержащиеся в нем строки находятся в куче. Как только строковый литерал попадает в пул строк, он никогда не будет из него удален. Таким образом, все строковые литералы в пуле строк доступны до завершения программы и, следовательно, не имеют права на сборку мусора. (Строки, добавленные в пул строк другими способами, могут иметь право на сборку мусора.)
Если мы создадим новый объект String с помощью new String("abc")
, то произойдут две вещи: во-первых, из-за строкового литерала «abc» создается новый объект String с содержимым «abc» и добавляется в пул строк (если его там еще нет. ). Затем из-за конструктора new String(...)
создается новый объект String, который является копией строкового литерала. Эта новая строка не помещается в пул строк. Таким образом, new String("abc") == "abc"
не выполняется.
Код new StringBuilder("abc")
не делает то же самое, что и new String("abc")
, потому что он создает объект StringBuilder, а не String. Однако из-за строкового литерала «abc» он гарантирует, что объект String с содержимым «abc» находится в пуле строк.
person
Hoopje
schedule
25.01.2015
new String("abc")
, строковый литерал уже находится в пуле интернированных строк. - person Hot Licks   schedule 25.01.2015