Где хранятся строки в JVM: в куче или в стеке
JavaJVMпамятьразработкастроки
Что проверяют
Отличаете ли вы ссылку от объекта и знаете ли, что такое пул строк. Вопрос простой, но ответ «в стеке» встречается регулярно.
Как отвечать
Сам объект String всегда лежит в куче. В стеке может лежать только ссылка на него, как локальная переменная метода.
Дальше стоит рассказать про пул строк, ради него вопрос и задают:
- строковые литералы попадают в пул и переиспользуются: две переменные с литералом
"hello"указывают на один объект, поэтому сравнение через==для них неожиданно возвращаетtrue; new String("hello")создаёт отдельный объект вне пула, и==уже даётfalse. Поэтому строки сравнивают черезequals, всегда;- пул с Java 7 живёт в куче, а не в постоянной области, как раньше. Его размер настраивается, и объекты из него собираются мусорщиком;
intern()позволяет положить строку в пул вручную, но злоупотреблять этим не стоит;- строки неизменяемы, поэтому конкатенация в цикле создаёт новые объекты. Компилятор превращает
+вStringBuilderдля простых случаев, но в цикле это делать нужно самому; - с Java 9 внутри строки лежит
byte[]с признаком кодировки вместоchar[]: латиница занимает вдвое меньше памяти.
Где спотыкаются
Говорят, что строки лежат в стеке, потому что переменная объявлена в методе.
Сравнивают строки через == и объясняют случайно работающий пример «оптимизацией».
Не знают, что склейка в цикле без StringBuilder даёт квадратичную нагрузку на память.