Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
额外的数组在Java中不消耗内存?_Java_Arrays_Memory - Fatal编程技术网

额外的数组在Java中不消耗内存?

额外的数组在Java中不消耗内存?,java,arrays,memory,Java,Arrays,Memory,在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]); Sys

在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);
}
for(int i=0;i<100;i++){
int n=100000;
int[]数组=新的int[n+n/2];
int[]arrayzip=新的int[n];
数组复制(array,0,arrayzip,0,n);
hashmap.put(x,arrayzip);
}

如果我们将任何代码样本放在一个循环中,然后创建
arrayzip
100
,然后所有
100
引用都由于在循环中的作用域而消失了。Aaa,现在我明白了,所以对象
newint[]
是在堆上创建的,但它们不会丢失(垃圾收集),因为它们将引用存储在范围外的对象
hashmap
中。酷,我明白

否,两个示例创建相同数量的数组-2。它们都包含以下数组创建表达式:

new int[n + n / 2]
new int[n]
您认为在哪里创建了另一个阵列?或者您没有在第二种情况下发现数组创建表达式,在下面的语句中:

hashmap.put(x, new int[n]);
在第一个版本中,对其中一个对象的引用被指定给一个局部变量,这一事实在创建多少个对象方面没有区别

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

So
hashmap.put(x,arrayzip)
存储
arrayzip
的引用,而不复制它(通过值传递)?@SophieSperner:是的。在Java中,所有参数都是按值传递的,但每个值都只是一个原语或引用,而不是一个对象。这并不是关于数组的,而是关于参数传递和一般的类型系统。确保您了解其工作方式是绝对值得的——如果您是从一本书中学习Java,请认真阅读该部分。