В Java, почему это
int n = 100000;
int[] array = new int[n + n / 2];
int[] arrayzip = new int[n];
System.arraycopy(array, 0, arrayzip, 0, n);
hashmap.put(x, arrayzip);
И это
int n = 100000;
int[] array = new int[n + n / 2];
hashmap.put(x, new int[n]);
System.arraycopy(array, 0, hashmap.get(x), 0, n);
Взять столько же памяти? В первом примере кода создается дополнительный массив.
[EDIT] Хорошо, теперь второй вопрос:
for (int i = 0; i < 100; i++) {
int n = 100000;
int[] array = new int[n + n / 2];
int[] arrayzip = new int[n];
System.arraycopy(array, 0, arrayzip, 0, n);
hashmap.put(x, arrayzip);
}
Что, если мы поместим какой-либо образец кода в цикл, тогда arrayzip
будет создан 100
раз, а затем все ссылки 100
исчезнут из-за того, что область видимости находится в цикле. Ааа, теперь я понимаю, поэтому объекты new int[]
создаются в куче, но они не теряются (собираются мусором), потому что они сохранили свои ссылки в объекте вне области видимости hashmap
. Круто, я понял!
1 ответ
Нет, в обоих примерах создается одинаковое количество массивов - 2. Оба они содержат следующие выражения создания массивов:
new int[n + n / 2]
new int[n]
Как вы думаете, где создается еще один массив? Или вы не заметили выражение создания массива во втором случае в этом утверждении:
hashmap.put(x, new int[n]);
Тот факт, что в первой версии ссылка на один из них назначается локальной переменной, без разницы в том, сколько объектов создается.
(Между прочим, я лично значительно предпочел бы первый код второму. Это гораздо проще понять, ИМО.)
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
hashmap.put(x, arrayzip)
хранит ссылку наarrayzip
и не делает (это называется глубокой?) Его копией (передача по значению)?