我正在做一些学习,我遇到了一个问题,要求显示以下代码的正确内存图:
int [] d1 = new int[5];
d1[0] = 3;
Integer [] d2 = new Integer[5];
d2[0] = new Integer(3);
ArrayList d3 = new ArrayList();
d3.add(3);
Run Code Online (Sandbox Code Playgroud)
这是我对内存图的尝试,但可能不正确:

我理解对象,实例变量和"新"实例都在堆上,局部变量和基本类型之类的东西都在堆栈上,但在数组类型方面我仍然感到困惑.
任何帮助表示赞赏.
Java上的任何对象都存在于堆上.
在Java中,Array也是一个Object,因此数组Object存在于堆上.
释: -
当你写作
int a=new int[5],
Run Code Online (Sandbox Code Playgroud)
(new int [5])部分创建对象,因此生活在堆上.
Integer x=new Integer(10000)
Run Code Online (Sandbox Code Playgroud)
也是一个Object(记住新的Operator将始终创建新的Object).
因此当你怀疑时,
Integer [] d2 = new Integer[5];
Run Code Online (Sandbox Code Playgroud)
它是整数对象的数组.
就ArrayList而言,它也是一个类,但它包装数组Object并为其添加动态内存.所以,
ArrayList d3 = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
再次创建对象,因此生活在堆上.
将ArrayList类视为:
class ArrayList{
int index=0;
Object[] obj=new Object['some integer value (depends on JVM)'];
public void add(Object o){
obj[index]=o;
index++;
}
//other methods
}
Run Code Online (Sandbox Code Playgroud)
所以当你写d3.add(5)实际上正在调用d3.add(new Integer(5)).
记住一条黄金法则:在java中你在HEAP上创建的任何对象以及它们在堆栈上的实时引用.
数组作为对象的证明: -
int[] a={4,3,1,2};
System.out.println(a instanceof Object);
Run Code Online (Sandbox Code Playgroud)
//打印为true