哪一个会堆栈或堆?

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

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中,Array也是一个对象,因此数组Object就存在于堆中。

释: -

当你写

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(新的Integer(5))被调用。

记住一条黄金法则:在Java中,无论你在HEAP上生成的对象是什么对象,并且它们的引用都会在堆栈上生效

数组作为对象的证明: -

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

//打印真实


数组在Java中不是原始的,它在java中具有具体的类。

数组是一个容器对象,它拥有固定数量的单个类型的值。 创建数组时创建数组的长度。

System.out.print(int[].class.toString());

所以当你创建任何数组类型的Object时,它必须去你的堆空间。


这是一个备用的,正确的内存图。

链接地址: http://www.djcxy.com/p/13865.html

上一篇: Which goes on the stack or heap?

下一篇: Object creation on the stack/heap?