在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
引用都会因为循环中的作用而消失。 Aaa,现在我明白了,所以在堆上创建了对象new int[]
,但它们不会丢失(垃圾收集),因为它们将引用存储在超出范围的对象hashmap
中。很酷,我明白了!
答案 0 :(得分:10)
不,两个示例都创建了相同数量的数组 - 2.它们都包含以下数组创建表达式:
new int[n + n / 2]
new int[n]
您认为另一个阵列的创建地点在哪里?或者你没有在第二种情况下发现数组创建表达式,在这句话中:
hashmap.put(x, new int[n]);
在第一个版本中,对其中一个的引用被分配给局部变量这一事实使得 no 在创建的对象数方面存在差异。
(顺便说一句,我个人非常更喜欢第一个代码而不是第二个代码。理解它更简单,IMO。)