В 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
Sophie Sperner 20 Мар 2013 в 23:40

1 ответ

Лучший ответ

Нет, в обоих примерах создается одинаковое количество массивов - 2. Оба они содержат следующие выражения создания массивов:

new int[n + n / 2]
new int[n]

Как вы думаете, где создается еще один массив? Или вы не заметили выражение создания массива во втором случае в этом утверждении:

hashmap.put(x, new int[n]);

Тот факт, что в первой версии ссылка на один из них назначается локальной переменной, без разницы в том, сколько объектов создается.

(Между прочим, я лично значительно предпочел бы первый код второму. Это гораздо проще понять, ИМО.)

10
Jon Skeet 20 Мар 2013 в 23:41
Итак, hashmap.put(x, arrayzip) хранит ссылку на arrayzip и не делает (это называется глубокой?) Его копией (передача по значению)?
 – 
Sophie Sperner
20 Мар 2013 в 23:43
4
@SophieSperner: Да. В Java все аргументы передаются по значению, но каждое значение является либо примитивом, либо ссылкой, а не объектом. На самом деле речь идет не о массивах - это о передаче аргументов и о системе типов в целом. определенно стоит убедиться, что вы понимаете, как это работает - если вы изучаете Java по книге, прочтите этот раздел очень, очень внимательно.
 – 
Jon Skeet
20 Мар 2013 в 23:45