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”