Сколько объектов создается с помощью массива? [Java]

#java #arrays #oop #object

#java #массивы #ооп #объект

Вопрос:

Здравствуйте, я хотел бы знать, сколько объектов создано с помощью этого массива?

 String arr[] = {"Paul", "Steven", "Jennifer", "Bart"};
  

Заранее спасибо!

Ответ №1:

Создано девять объектов.

Каждая строка представляет собой ДВА объекта. Ссылка на строку и лежащий в основе строки char[] . Итак, для 4 строк это 8 объектов.

Тогда существует String[] сам массив, всего 9.

Это, конечно, предполагает, что строковый литерал еще не intern() отредактирован JVM. Если это так, то он не создаст массив String , а вместо этого извлечет его из intern пула, что может дать вам в общей сложности 1, 3, 5, 7 или исходные 9 созданных объектов, в зависимости от того, сколько String ов intern создано.

Комментарии:

1. Или, может быть, зависело от реализации?

2. Это может быть больше, хотя я не понимаю, как это может быть меньше. Вам, как минимум, понадобится String[] ссылка, ссылка для каждого String и по одной для каждого char[] , который его поддерживает. Я не могу вспомнить, какие еще объекты они туда поместили (и проверка источника показала, что их там нет), хотя вполне возможно, что они могли бы.

3. Строки, возможно, уже были созданы в JVM, и массив может просто заимствовать ссылку напрямую. Итак, Леник прав, это зависит от реализации JVM.

4. @Tim я тоже так подумал. Тот, кто придумал это как головоломку, заслуживает некоторой похвалы, но тот, кто выставит это на экзамене, должен быть расстрелян.

5. @Sebastian Следует учитывать, что это могло быть написано техническим специалистом, у которого никогда не было работы и который не обладает навыками критического мышления. Он может не осознавать, что на самом деле их 9 Object . При этом печально, насколько мало развиваются навыки критического мышления. Мне пришлось поспорить с кем-то по поводу сериализации строк. Он сказал: «Две строки длиной 16 должны занимать 64 байта данных». Это имеет смысл, 16 * 2 байта на символ * 2 строки = 64 байта. Но оказывается, что это больше похоже на 400 из-за некоторых накладных расходов. Мелочи могут иметь значение, но многим разработчикам действительно не хватает навыков критического мышления.

Ответ №2:

 String arr[] = {"Paul", "Steven", "Jennifer", "Bart"};
for (Object o : arr) {
   System.out.format("%dn", o.hashCode());
}
System.out.format("%dn", arr);
  

Вы должны получить 5 различных хэш-кодов. Убедительное предположение, что теперь в вашей куче существует 5 объектов.

Комментарии:

1. Спасибо, ваш ответ был правильным с самого начала, другие здесь просто вдавались в подробности, но спасибо за совет с хэш-кодами…

2. Количество объектов, существующих после инструкции, само по себе не дает информации о том, сколько объектов было создано этой инструкцией.

Ответ №3:

От 1 до 5 в зависимости от реализации и состояния JVM. По-видимому, создан новый массив строк, строки — мы не знаем.

РЕДАКТИРОВАТЬ: Как кто-то указал в других ответах. 1-9 было бы более точным ответом. Поскольку вы создаете символ[] внутри строки, когда она создается.

Ответ №4:

Ответ — none, потому что Array не может создавать объекты, только new может. 😛

Комментарии:

1. Коды операций указаны в спецификации JVM для работы путем помещения в стек построенного соответствующим образом объекта String. Это зависит от реализации, и возможно, что если строки использовались до этого, то String которые уже были intern() отредактированы, создавать не придется, но мы не можем на это полагаться.

2. Да, вероятно, но только для примитивных типов данных, я думаю, поскольку String — это объекты естественным образом, вам не понадобится ‘new’ для создания нового объекта.

3. Для наглядности я пошутил, отсюда и «:P». Я с радостью приму голоса «нет» в качестве наказания.

4. О, хорошо, лол, я проверял другие страницы, и они говорили «4», что было бы невозможно, поскольку массив также является объектом, или другие также сказали «нет», поэтому мне было интересно

Ответ №5:

В зависимости от того, как вы на это смотрите, вы могли бы сказать 9 объектов или только один. Если вы посмотрите на этот массив в отладчике, вы сможете увидеть 9 объектов, массив, строковые объекты и символ[] в этих символах[].

Однако строковые литералы находятся в пуле и создаются не каждый раз (только один раз), поэтому, если вы запускаете эту строку много раз, вы будете каждый раз создавать только массив. т. Е. создается только один дополнительный объект.

Ответ №6:

привет,

Создано пять объектов.

Если вы используете

int[] i = new int[5];

затем jvm создаст один объект в куче.

Но если вы предоставляете элементы в массив, например, для

 i[0] = 1;
i[1] = 2;
.
.
i[4] = 5;
  

затем jvm создаст шесть объектов с пятью целыми числами и один объект массива в куче.

Комментарии:

1. Точно, но вам нужно ‘new’ внутри создания, иначе его бы не было, хорошо, спасибо, ребята… Испортил мой экзамен по Java: P Я действительно думал, что 5, но теперь я помню, что это должно быть с ‘new’, чтобы на самом деле создать массив…

2. Да, вы можете взглянуть на эту ссылку для получения дополнительной помощи [ coderanch.com/t/418315/java-programmer-SCJP/certification /…

3. Нет, в этом случае никакие объекты не будут созданы при присвоении значений, потому что int это не объект, а первичный тип!

4. @Sebastian, опубликованный вами пример кода включает некоторый синтаксический сахар, который автоматически создает массив строк размером 4, поэтому {«a», «b», «c», «d»} является строкой[4].

5. @Joachim Sauer: Спасибо, вы правы, но это был всего лишь пример, и я также предоставил ему хорошую ссылку, чтобы он мог это хорошо понять.