-1

在 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);

占用相同数量的内存?在第一个代码示例中,创建了一个额外的数组。

[编辑]好的,现在是第二个问题:

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[]是在堆上创建的,但它们不会丢失(垃圾收集),因为它们将引用存储在范围外的 objecthashmap中。酷,我明白了!

4

1 回答 1

10

不,两个样本都创建了相同数量的数组 - 2。它们都包含以下数组创建表达式:

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

您认为在哪里创建了另一个数组?或者您是否没有发现第二种情况下的数组创建表达式,在此语句中:

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

在第一个版本中,对其中一个的引用被分配给局部变量这一事实在创建多少对象方面没有区别。

(顺便说一句,我个人喜欢第一个代码而不是第二个代码。它更容易理解,IMO。)

于 2013-03-20T19:41:45.797 回答