Давайте пройдемся по строке.
Строка 11
Легкое начало, здесь нет созданных строк.
Строка 12
Мы присваиваем строку "Fred"
s
. Хотя похоже, что здесь создана строка, эта строка будет жить в постоянном пуле. JVMS раздел 2.17.6 Создание экземпляров нового класса гарантирует, что объекты для строковых литералов будут самое позднее будут созданы при загрузке окружающего класса, что определение до вызова метода . Поэтому в этой строке не создаются новые строковые объекты.
Строка 13
Ссылка на буквальную строку "47"
, которая снова будет создана статически (как указано выше). Однако есть также вызов оператора +
, который создаст новую строку для хранения результата конкатенации. Итак, это первая созданная строка.
Строка 14
Метод substring
действительно создает новую строку. Он разделяет базовый символьный массив со своим родителем - и поэтому почти не требует дополнительной памяти - но поскольку строки являются неизменяемыми, для каждого различного строкового представления требуется отдельный объект String
. (Это, вероятно, ошибка - мой первый инстинктивный ответ был «ах, строка, созданная подстрокой, является особенной», но, конечно, ей все равно нужно создать новый объект).
Строка 15
Как и выше - представление в верхнем регистре отличается, поэтому для хранения результата необходимо создать новую строку.
Строка 16
Strings
переопределяет метод toString()
на простой return this
- следовательно, дополнительная строка не создается.
Счет на дверях
По моим подсчетам, это три объекта String, созданные во время этого метода (два из этих объектов совместно используют один и тот же базовый символьный массив и два ранее существующих объекта, на которые ссылаются строковые литералы).