原始数组是以堆栈还是堆存储的?
我有一个这样的数组声明:
int a[];
这里的a
是一个原始int
types的数组。 这个数组在哪里存储? 它存储在堆或堆栈上吗? 这是一个primitvetypes的int
,所有原始types都不存储在堆上。
正如gurukulki所说,它存储在堆上。 然而,您的post提出了一个误解,可能是由于一些善意的人宣传“原始人总是活在堆栈中”的神话。 这是不真实的。 局部variables在堆栈上有它们的值,但并不是所有的原始variables都是本地的…
例如,考虑一下:
public class Foo { int value; } ... public void someOtherMethod() { Foo f = new Foo(); ... }
现在, f.value
居住在哪里? 神话会build议它在堆栈上 – 但实际上它是新的Foo
对象的一部分,并且存在于堆1上 。 (请注意, f
本身的值是一个引用,并且位于堆栈上。)
从那里开始,这对数组来说是一个简单的步骤。 你可以把一个数组当成很多variables – 所以new int[3]
有点像这样的一个类:
public class ArrayInt3 { public readonly int length = 3; public int value0; public int value1; public int value2; }
1事实上,这比这更复杂。 堆栈/堆的区别主要是一个实现细节 – 我相信有些JVM,可能是实验性的,可以告诉一个对象永远不会从一个方法“转义”出来,并且可以把整个对象分配给堆栈。 但是,如果你select关心,它在概念上是堆的。
它将被存储在堆上
因为数组是java中的一个对象。
编辑 :如果你有
int [] testScores; testScores = new int[4];
想想这个代码对编译器说:“创build一个数组对象,它将保存四个整数,并将其分配给名为testScores的引用variables。另外,请继续并将每个int元素设置为零,谢谢。
它是一个原始types的数组,它本身并不是原始的。 一个好的经验法则是,当涉及到新的关键字时,结果将在堆上。
我只是想分享一些我在这个主题上运行的testing。
数组大小10万
public static void main(String[] args) { memInfo(); double a[] = new double[10000000]; memInfo(); }
输出:
------------------------ max mem = 130.0 MB total mem = 85.0 MB free mem = 83.6 MB used mem = 1.4 MB ------------------------ ------------------------ max mem = 130.0 MB total mem = 130.0 MB free mem = 48.9 MB used mem = 81.1 MB ------------------------
正如你所看到的,堆大小增加了〜80MB,即10m * sizeof(double)。
但如果我们使用Double而不是Double
public static void main(String[] args) { memInfo(); Double a[] = new Double[10000000]; memInfo(); }
输出将显示40MB。 我们只有双引用,它们没有被初始化。
填充双
public static void main(String[] args) { memInfo(); Double a[] = new Double[10000000]; Double qq = 3.1d; for (int i = 0; i < a.length; i++) { a[i] = qq; } memInfo(); }
还是40MB。 因为它们都指向同一个Double对象。
用double来初始化
public static void main(String[] args) { memInfo(); Double a[] = new Double[10000000]; Double qq = 3.1d; for (int i = 0; i < a.length; i++) { a[i] = qq.doubleValue(); } memInfo(); } Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
线
a[i] = qq.doubleValue();
相当于
a[i] = Double.valueOf(qq.doubleValue());
相当于
a[i] = new Double(qq.doubleValue());
由于我们每次创build新的Double对象,所以我们吹出堆。 这显示了Double类中的值存储在堆中。
在Java编程语言中,数组是对象,是dynamic创build的,并且可以被分配给Objecttypes的variables。
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html