我正在做一些学习,我遇到了一个问题,要求显示以下代码的正确内存图:
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);
以下是我对内存图的尝试,但可能不正确:
我理解对象,实例变量和“新”实例都在堆上,局部变量和基本类型之类的东西都在堆栈上,但在数组类型方面我仍然感到困惑。
感谢任何帮助。
答案 0 :(得分:5)
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();
再次创建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);
//打印true
答案 1 :(得分:0)
数组中的数组不是原始的,它在java中具有具体的类。
数组是一个容器对象,它包含固定数量的值 单一类型。数组的长度是在数组的时候建立的 创建
System.out.print(int[].class.toString());
因此,当您创建任何数组类型的Object时,它必须转到堆空间。
答案 2 :(得分:0)
这是一个备用的,正确的内存图。