2015-02-24 3 views
0

Еще один экзамен вопрос, что заставляет меня путать:объектов Строки SCJP

public String makinStrings() { 
String s = “Fred”; 
s = s + “47”; 
s = s.substring(2, 5); 
s = s.toUpperCase(); 
return s.toString(); 
} 

вопрос: «? Сколько строки объектов будут создаваться, когда этот метод вызывается»

правильный ответ должен быть 3, но я насчитал больше:
Фред
Fred47
ED4
ED4

является 3 действительно правильный ответ? Если да - почему?

ответ

1

Строковые константы создаются в момент создания экземпляра класса. Из-за этого строки «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 ...

+0

Из спецификации языка Java [Constant Pool был перемещен в Java Heap с Java 7] (http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html#jdk7changes) и ранее пул находился в «пространстве пермг» на JVM Hotspot. –

+1

это не исключает того факта, что строковые константы не создаются при вызове метода, но когда экземпляр класса создается, не так ли? –

+0

Nopes это не исключает, но комментарий на вашей предыдущей версии ответа, где была упомянута концепция кеш-памяти ...... –

0

3 объектов:
Фред
Fred47
ED4

s = s + “47”; 

47 не будет создан на струнный бассейн

s = s.substring(2, 5); 

Не следует создать отдельную строку, но будет следовать мухи и внутренне указывают на одну и ту же строку.

+0

Почему 47 не будет создан в String Pool, а если нет, то где он будет создан? и 's.substring (2,5)' определенно собираются создать новый String 'Object в памяти кучи' –

Смежные вопросы