哪个堆栈或堆?

blu*_*tuu 8 java heap stack

我正在做一些学习,我遇到了一个问题,要求显示以下代码的正确内存图:

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)

这是我对内存图的尝试,但可能不正确:

在此输入图像描述

我理解对象,实例变量和"新"实例都在堆上,局部变量和基本类型之类的东西都在堆栈上,但在数组类型方面我仍然感到困惑.

任何帮助表示赞赏.

Web*_*ver 5

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