Создает ли intern() литерал в пуле?

String s1=new String("abcd");
s2=s1.intern();

сказано, что intern() создаст строковый литерал в пуле, если он еще не присутствует.

Мой вопрос: когда возникнет этот сценарий, когда строковый объект присутствует, но не литерал? И intern() должен будет фактически пойти и создать новый литерал, а затем вернуть ссылку на литерал.


person noobCoder    schedule 15.04.2016    source источник
comment
Мы не хотим помещать каждую строку в пул строк. Хранение строки в пуле имеет смысл только в том случае, если вы собираетесь повторно использовать эту строку позже, например, это относится к строковым литералам, которые вы создали в коде, где они могут понадобиться вам много раз, например for (i..){ System.out.print("write your number:"); array[i]=readNumber();}. Но если вы читаете некоторый текст из внешнего источника, такого как файл/консоль/сокет/другой, например, построчно, вы действительно не хотите, чтобы JVM запоминал все такие строки. Вы можете распечатать их только один раз и позволить GC удалить их из памяти.   -  person Pshemo    schedule 16.04.2016


Ответы (1)


Например:

String first = "ab";
String second = "cd";
String interned = first.concat(second).intern();

Большинство строк в программе создаются динамически: путем объединения значений, получения их через сокет, чтения их из файлов или баз данных, из консоли или графического интерфейса.

Обратите внимание, что ваша терминология неверна. intern() не создает строковый литерал. Он добавляет строку в пул, а строковые литералы (т. е. строки, появляющиеся буквально в байт-коде, например "abcd"), сохраняются в пуле вместе с явно интернированными строками.

person JB Nizet    schedule 15.04.2016
comment
Можно ли контролировать, какие строки попадают в пул? Насколько я понимаю, каждая строка должна быть в пуле. - person noobCoder; 16.04.2016
comment
Строковые литералы находятся в пуле. Другие строки - нет, если вы их не интернируете. Почему, черт возьми, ты хочешь положить все струны в пул? Допустим, вы читаете файл размером 1 ГБ построчно, чтобы извлечь некоторые данные и записать их в другой файл. Тогда вам потребуется 2 ГБ памяти, чтобы хранить все эти строки в памяти, и ни за что: вы больше никогда не будете использовать эти строки повторно. - person JB Nizet; 16.04.2016
comment
Вам не нужно 2 ГБ памяти; добавление строки в пул не подразумевает создание нового экземпляра — это зависит от реализации. Вы можете получить тот же экземпляр, который теперь является членом пула. Что еще более важно, даже после добавления строк в пул они все еще могут быть удалены сборщиком мусора. Таким образом, потребление памяти не изменится. Тем не менее, добавление этих временных строк в пул создает накладные расходы без каких-либо преимуществ, поскольку стажировка требует некоторого поиска, например. хеширования, а у сборщика мусора может быть дополнительная работа по очистке ссылок пула. - person Holger; 21.11.2016