Строковые объекты, созданные методом - PullRequest
3 голосов
/ 22 ноября 2011

Я делаю несколько пробных тестов для своей сертификации Oracle Certified Java Programmer.Один из вопросов, который я нашел в тесте, таков:

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

И вопрос «Сколько объектов String будет создано при вызове этого метода?».Я считаю 5: «Фред», «47», «Фред47», подстрока «ed4» и строка в верхнем регистре «ED4», но ответ на вопрос состоит из 3 объектов (и документа, в котором тест не имеетраздел объяснения).Можете ли вы указать, где моя ошибка?

Ответы [ 3 ]

4 голосов
/ 22 ноября 2011

Похоже, ошибка в интерпретации "сколько объектов строк будет создано когда этот метод вызывается"

Вы правы, заявив, что задействованы пять строк;однако строки являются неизменяемыми, и две из них являются константами, которые скомпилированы в класс, содержащий метод makinStrings().Таким образом, две из ваших пяти уже существуют для вызова метода, и создаются только три «новые» строки.

Две строки констант существуют в пуле констант класса и были созданы во время загрузки класса.

4 голосов
/ 22 ноября 2011

Строка «Fred» и «47» являются статическими, то есть они создаются при загрузке класса, а не при вызове метода.

1 голос
/ 22 ноября 2011

Лучше всего я вижу:

public String makinStrings() { 
 String s = “Fred”; 

"Fred" - строковый литерал, созданный и добавленный в пул String во время загрузки класса.Объект не создается, когда он назначен;присваивание просто передает ссылку на существующую строку.

 s = s + “47”; 

Здесь новая строка создается как комбинация предыдущего значения s и литерала "47".(1)

 s = s.substring(2, 5);

substring () не работает с самой строкой (строки неизменяемы в Java), а возвращает новую строку, которая является возвращаемым значением метода.(2)

 s = s.toUpperCase();

Новая строка по той же причине, что и предыдущая строка.(3)

  return s.toString();
}

toString () в классе String возвращает ссылку на саму String.Новый объект не создан.

Так что 3 звучит как правильный ответ.

...