2016-12-03 1 views
0

Сегодня, я имел следующий вопрос экзамена:Количество объектов создано

String[] subjects=new String[10]; 
String subname="POPL-201617"; 
subjects[0]=subName; 
subName=null; 
  1. Сколько объектов созданы?

    Мой ответ: будут созданы 11 объектов. 10 из первого оператора, а один - строковый литерал.

  2. Сколько ссылок на эти объекты существует после выполнения кода?

    Мой ответ: В общей сложности имеется одна ссылка на «POPL-201617».

  3. Объясните, подходят ли эти объекты для сбора мусора.

    Мой ответ: поскольку имеется ссылка на «POPL-201617», он не имеет права на сбор мусора. Даже если ссылки не было, это интернированная строка и, следовательно, не может быть собрана мусор. Остальные все имеют право на сбор мусора.

Меня беспокоит первое заявление. Мы не передаем аргумент конструктору класса String. Будет ли он формировать объекты или просто пространство выделяется в куче?

Кроме того, в моем понимании говорится, что предметы первоначально указывают на базу массива. Итак, первый элемент первоначально имел ссылку. Но поскольку объекты [0] теперь относятся к POPL, элемент no array не имеет ссылки.

Правильно ли я? Или я чего-то не хватает?

+4

Вы не создаете * никаких * строковых объектов в первом выражении. Вы создаете массив (один объект). Каждый элемент массива будет пустой ссылкой. –

+0

Ад. Как я пропустил это? Там 6 очков. –

+0

Интернированные струны могут быть собраны при определенных обстоятельствах. – assylias

ответ

1

Единственное, что вы пропустили, это то, что String[] subjects=new String[10] создал только один объект типа String[].