2013-05-16 60 views
8

我做了一些研究,我跨越,要求以显示下面的代码的正确记忆图中的问题就来了:哪一个去堆栈或堆?

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

这是我在记忆图的尝试,但它可能是不正确的:

enter image description here

我理解一些对象,实例变量,和“新”的情况下,都在堆和东西,如局部变量和基本类型是在栈中,但我仍然感到困惑,当涉及到数组类型。

任何帮助表示赞赏。

+0

数组是在端部的'Object'(甚至基元的阵列)。顺便说一下,你接近最终答案。 –

+0

@LuiggiMendoza我改变了我的图。这是否是正确的答案? – blutuu

+2

几乎JVM维护一个'Integer'对象的池,从-128到127.所以对于'd2'数组和'd3' ArrayList,值为3的'Integer'将是相同的。 –

回答

5

Java上的任何对象都生活在堆上。

在Java数组中也是一个对象,因此数组Object也存在于堆中。

阐释: -

当编写

int a=new int[5], 

(新INT [5])的一部分创建对象,因此住在堆。

Integer x=new Integer(10000) 

也是一个对象(记住新的操作符总是会创建新的对象)。

,因此当你赖特,

Integer [] d2 = new Integer[5]; 

是Integer对象的数组。

至于ArrayList的被认为这也是一个类,但它包装阵列对象,并增加了动态存储器到它。 因此,

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(新的整数(5))被调用。

记住一个黄金法则: 在创建现场直播HEAP及其对堆栈活引用任何Java对象的。

阵列是对象的证明: -

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

//输出真

+0

不错。感谢您的解释。我觉得我现在有一个正确的图。你看到有什么问题吗? – blutuu

+0

图中没有问题,它的完美老兄!!!!!!! – WebServer

+0

感谢您的反馈。 – blutuu

0

数组不能Java原始它在Java的具体类。

数组是保存的 单一类型的值的固定数目的容器对象。数组长度为 时创建的数组长度。

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

所以,当你创建任何阵列的对象类型,必须去你的堆空间。

+0

噢好吧。我看到'int'并且认为这个数组是原始的。 – blutuu

+0

thery不在java中。 :) –

+0

哎呀。我明白。 – blutuu

0

这里是一个替换的,正确的存储器示图。

+0

该内存图仍然不正确,因此如果在堆中d1 [0]和d3 [0]指向相同的'3',但是d2 [0]和d3 [0]永远不会指向相同的'3 “ – sactiw