我有一个像这样的数组声明:
int a[];
此处a
是一个原始int
类型的数组。这个数组存储在哪里?它是存储在堆还是堆栈上?这是一个原始类型int
,所有原始类型都不存储在堆上。
答案 0 :(得分:144)
正如gurukulki所说,它存储在堆上。然而,你的帖子暗示了一个误解可能是由于一些善意的人传播了“原始人总是生活在堆栈中”的神话。这是不真实的。 局部变量在堆栈上有它们的值,但并非所有原始变量都是本地变量......
例如,考虑一下:
public class Foo
{
int value;
}
...
public void someOtherMethod()
{
Foo f = new Foo();
...
}
现在,f.value
住在哪里?神话会暗示它在堆栈上 - 但实际上它是新Foo
对象的一部分,并且存在于堆 1 上。 (请注意,f
本身的值是一个引用,并且存在于堆栈中。)
从那里开始,这是一个简单的数组步骤。您可以将数组视为很多变量 - 因此new int[3]
有点像这种形式的类:
public class ArrayInt3
{
public readonly int length = 3;
public int value0;
public int value1;
public int value2;
}
1 事实上,它比这更复杂。堆栈/堆的区别主要是实现细节 - 我相信一些JVM(可能是实验的JVM)可以告诉对象什么时候从方法“逃脱”,并且可以在堆栈上分配整个对象。但是,如果您选择关注,它在堆上的概念。
答案 1 :(得分:36)
它将存储在堆
上因为array是java中的一个对象。
编辑:如果您有
int [] testScores;
testScores = new int[4];
将此代码视为对编译器说:“创建一个包含四个整数的数组对象,并将其分配给名为testScores
的引用变量。另外,继续设置每个int
元素为零。谢谢。“
答案 2 :(得分:20)
它是一个原始类型的数组,它本身并不是原始的。一个好的经验法则是当涉及new关键字时,结果将在堆上。
答案 3 :(得分:15)
我只想分享一些关于这个主题的测试。
1000万的数组
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
------------------------
如您所见,使用的堆大小增加了~80 MB,即10m * sizeof(double)。
但是如果我们使用Double而不是double
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
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;
}
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());
由于我们每次都会创建新的Double对象,因此我们会将堆炸出来。 这表明Double类中的值存储在堆中。
答案 4 :(得分:2)
在Java编程语言中,数组是对象,是动态创建的,可以分配给Object类型的变量。
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html