С чего вы взяли, что интернированный String первым идет молодому поколению?Метод String#intern()
является нативным.Конечно, для реализации очень возможно переместить ее прямо в permgen.
Второй вопрос: если нет других ссылок на этот экземпляр "test"
String, он подходит для сборки мусора.Та же история, если она интернирована.Даже внутренняя строка, у которой больше нет активных ссылок, может быть собрана сборщиком мусора.Впрочем, этого не могло быть в старых JVM.И это может зависеть от реализации, я думаю.
Что касается третьего вопроса, я не знаю.Все, что я знаю, это то, что строковые литералы из исходного кода помещаются в один и тот же пул.Если бы вы должны были создать String, равную константе String из источника, а затем интернировать ее, вам был бы возвращен экземпляр, который использовался для представления константы.Думайте об этом как о строковых литералах, которые были интернированы сразу.
РЕДАКТИРОВАТЬ: просто прочитайте ваши первые несколько предложений снова, и я думаю, что вижу причину путаницыКогда вы вызываете intern()
для String, и в пуле еще нет равных String, тогда сначала не будет построена эквивалентная String.Он просто переместит экземпляр, который вы назвали intern()
, в пул, а не вернет новую ссылку. Так сказано в JavaDoc .