java-堆栈或堆上哪个?

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

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);

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

我了解对象,实例变量和“新”实例之类的东西都在堆上,而局部变量和原始类型之类的东西都在堆栈上,但是对于数组类型,我仍然感到困惑.

任何帮助表示赞赏.

最佳答案
Java上的任何对象都位于堆上.

在Java中,数组也是对象,因此数组对象存在于堆中.

释: –

当你写

int a=new int[5],

(new int [5])部分创建对象,因此驻留在堆上.

Integer x=new Integer(10000)

也是一个对象(请记住,新运算符将始终创建新对象).

因此,当你怀特的时候,

Integer [] d2 = new Integer[5];

它是整数对象数组.

就ArrayList而言,它也是一个类,但是它包装了数组Object并为其添加了动态内存.
所以,

ArrayList d3 = new ArrayList();

再次创建对象并因此驻留在堆上.

将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
}

所以当你写
d3.add(5)实际上正在调用d3.add(new Integer(5)).

记住一个黄金法则:
在Java中,无论您创建的任何对象都在HEAP上运行,而它们的引用在堆栈上运行.

数组作为对象的证明:-

int[] a={4,3,1,2};
System.out.println(a instanceof Object);

//打印true

转载注明原文:java-堆栈或堆上哪个? - 代码日志