哪个堆栈或堆?

时间:2013-05-16 04:48:18

标签: java stack heap

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

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

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

enter image description here

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

感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

Java上的任何对象都存在于堆上。

在Java中,Array也是一个Object,因此数组Object存在于堆上。

阐释: -

写作时

int a=new int[5],

(new int [5])部分创建对象,因此生活在堆上。

Integer x=new Integer(10000)

也是一个Object(记住新操作符将始终创建新的Object)。

因此当你怀疑时,

Integer [] d2 = new Integer[5];

它是整数对象的数组。

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

ArrayList d3 = new ArrayList();

再次创建Object,因此生活在堆上。

将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

答案 1 :(得分:0)

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

  

数组是一个容器对象,它包含固定数量的值   单一类型。数组的长度是在数组的时候建立的   创建

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

因此,当您创建任何数组类型的Object时,它必须转到堆空间。

答案 2 :(得分:0)

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