哪个堆栈或堆?

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

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,因此数组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(); 

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

将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上创建的任何对象以及它们在堆栈上的实时引用。

数组作为对象的certificate: –

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

//打印为true

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

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

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

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

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