Java 哪一个在堆栈或堆上?

Java 哪一个在堆栈或堆上?,java,heap-memory,stack-memory,Java,Heap Memory,Stack Memory,我正在做一些研究,遇到一个问题,要求显示以下代码的正确内存图: 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); 下面是我尝试的内存图,但可能不正确: 我知道对象、实例变量和“新”实例都在堆上,局部变量和基元类型都在堆栈上,但对于数组类型,我仍然感到困惑 非常感谢您的帮助。

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

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中有具体的类

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


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

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

Integer x=new Integer(10000)
在Java中,数组也是一个对象,因此数组对象位于堆上

Integer x=new Integer(10000)
解释:-

当你写作时

int a=new int[5],
(newint[5])部分创建对象,因此位于堆上

Integer x=new Integer(10000)
也是一个对象(请记住,新操作符将始终创建新对象)

因此,当你

Integer [] d2 = new Integer[5];
它是整数对象的数组

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

记住一条黄金法则: 在java中,您创建的任何对象都在堆上活动,它们的引用在堆栈上活动

数组是对象的证明:-

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

//打印正确的

这是另一个正确的内存图


数组最终是一个
对象
(甚至是一个原语数组)。顺便说一句,你已经接近最终答案了。@LuiggiMendoza我已经改变了我的图表。这是正确的答案吗?几乎,JVM为从-128到127的
Integer
对象维护一个池。因此,对于
d2
数组和
d3
ArrayList,值为3的
整数将是相同的。@luigimendoza那么d3 ArrayList的第一个索引是否应该指向d2[0]指向的块?@luigimendoza。谢谢哦,好的。我看到了“int”,并认为该数组是原始数组。它们不是java的。:)美好的谢谢你的解释。我觉得我现在有了一个正确的图表。你看到它有什么问题吗?这个内存图仍然不正确,所以如果它是d1[0]和d3[0]指向堆中相同的“3”,那么d2[0]和d3[0]永远不会指向相同的“3”