8

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

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

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

在此处输入图像描述

我知道对象、实例变量和“新”实例等东西都在堆上,而局部变量和原始类型等东西都在堆栈上,但是当涉及到数组类型时我仍然感到困惑。

任何帮助表示赞赏。

4

3 回答 3

5

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

再次创建 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);

//打印为真

于 2013-05-16T05:06:56.797 回答
0

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

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

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

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

于 2013-05-16T04:51:35.933 回答
0

这是另一个正确的内存图。

于 2013-05-16T05:32:44.980 回答