【问题标题】:Which goes on the stack or heap?哪个在堆栈或堆上?
【发布时间】:2013-05-10 20:39:03
【问题描述】:

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

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

这是我对内存图的尝试,但可能不正确:

我知道对象、实例变量和“新”实例等东西都在堆上,而局部变量和原始类型等东西都在堆栈上,但是当涉及到数组类型时,我仍然感到困惑。

感谢任何帮助。

【问题讨论】:

  • 一个数组最终是一个Object(甚至是一个基元数组)。顺便说一句,你已经接近最终答案了。
  • @LuiggiMendoza 我已经改变了我的图表。这是正确的答案吗?
  • 几乎,JVM 为从 -128 到 127 的 Integer 对象维护了一个池。因此,Integer 的值为 3 将与 d2 数组和 d3 ArrayList 相同.
  • @LuiggiMendoza 那么 d3 ArrayList 的第一个索引是否应该指向 d2[0] 指向的块?
  • @LuiggiMendoza 太棒了。谢谢!

标签: java heap-memory stack-memory


【解决方案1】:

数组在java中不是原始的,它在java中有具体的类。

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

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

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

【讨论】:

  • 哦,好吧。我看到 'int' 并认为该数组是原始的。
  • 它们不在 java 中。 :)
【解决方案2】:

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

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

说明:-

当你写作时

int a=new int[5],

(new int[5]) 部分创建对象,因此存在于堆中。

Integer x=new Integer(10000)

也是一个对象(记住new Operator总是会创建新对象)。

因此当你写作时,

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

//打印为真

【讨论】:

  • 不错。感谢您的解释。我觉得我现在有一个正确的图表。你觉得有什么问题吗?
【解决方案3】:

这是另一个正确的内存图。

【讨论】:

  • 这个内存图仍然不正确,所以如果有的话,d1[0] 和 d3[0] 指向堆中的相同 '3' 但是 d2[0] 和 d3[0]永远不会指向同一个“3”
猜你喜欢
  • 2014-01-09
  • 2014-10-04
  • 2014-04-21
  • 1970-01-01
  • 2012-11-17
  • 2013-12-06
  • 2013-01-25
  • 2013-03-21
  • 1970-01-01
相关资源
最近更新 更多