Строковые константы создаются в момент создания экземпляра класса. Из-за этого строки «Fred» и «47» создаются до вызова метода, а не во время вызова метода.
Эта статья объясняет: The String Constant Pool
Но я уточню это немного больше: Java Virtual Machine Specification определяет, что константы «Фред» и «47» быть размещены в виде записей в строке Constant Pool. (java SE specs, loading and linking).
Это происходит , когда класс загружен.
Еще один момент для фокусировки здесь: вопрос в том, сколько объектов экземпляр.
Так,
Строка s = "Fred": не создавать новый объект String, использует только ссылку из интернализованного "Фреда" постоянная.
s = s + "47": оператор '+' подразумевает операцию конкатенации; результатом этой конкатенации является новый объект String. Итак, 1 экземпляр String. «47» был загружен с классом ...
S = s.substring (2,5): определение способа указывает, что новый объект строка должна быть возвращена (String.substring javadoc), таким образом, 2 строки экземпляра ,
Даже если реализация (это, например, the openJDK java.lang.String implementation) может использовать какое-то конструктор, чтобы относиться только к части массива символов, которые имеют внутреннее значение String, в результате является новой строки, даже если своего рода «ленивый».
s = s.toUpperCase(): здесь метод toUpperCase должен возвращать новую строку. Итак, создаются три строки.
И, наконец, s.toString() возвращает представление объекта как строки. Так как строка уже имеет String, то s.toString() возвращает только тот же объект String ...
Из спецификации языка Java [Constant Pool был перемещен в Java Heap с Java 7] (http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html#jdk7changes) и ранее пул находился в «пространстве пермг» на JVM Hotspot. –
это не исключает того факта, что строковые константы не создаются при вызове метода, но когда экземпляр класса создается, не так ли? –
Nopes это не исключает, но комментарий на вашей предыдущей версии ответа, где была упомянута концепция кеш-памяти ...... –