原始数组是以堆栈还是堆存储的?

我有一个这样的数组声明:

int a[]; 

这里的a是一个原始inttypes的数组。 这个数组在哪里存储? 它存储在堆或堆栈上吗? 这是一个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