#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: Спасибо, вы правы, но это был всего лишь пример, и я также предоставил ему хорошую ссылку, чтобы он мог это хорошо понять.