哪一个会堆栈或堆?
我正在做一些学习,并且遇到了一个问题,要求显示以下代码的正确内存图:
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就存在于堆中。
释: -
当你写
int a=new int[5],
(new int [5])部分创建对象并因此生活在堆上。
Integer x=new Integer(10000)
也是一个对象(记住新的操作符总是会创建新的对象)。
所以当你怀念时,
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(新的Integer(5))被调用。
记住一条黄金法则:在Java中,无论你在HEAP上生成的对象是什么对象,并且它们的引用都会在堆栈上生效
数组作为对象的证明: -
int[] a={4,3,1,2};
System.out.println(a instanceof Object);
//打印真实
数组在Java中不是原始的,它在java中具有具体的类。
数组是一个容器对象,它拥有固定数量的单个类型的值。 创建数组时创建数组的长度。
System.out.print(int[].class.toString());
所以当你创建任何数组类型的Object时,它必须去你的堆空间。
这是一个备用的,正确的内存图。
链接地址: http://www.djcxy.com/p/13865.html