【问题标题】:What part of an array local variable is stored on the stack? And which part is on the heap?数组局部变量的哪一部分存储在堆栈中?哪一部分在堆上?
【发布时间】:2014-11-19 04:55:51
【问题描述】:

假设我们有以下代码:

void method() {
    int[] test = new int[3];
    test[0] = 0;
    test[1] = 1;
    test[2] = 2;
}

根据我从Jon Skeet's post on SO 中读到的内容,new int[3] 部分相当于:

public class ArrayInt3 {
    public readonly int length = 3;
    public int value0;
    public int value1;
    public int value2;
}

这是否意味着test(对ArrayInt3 的引用)在堆栈中?这是否意味着ArrayInt3 在堆上?我想value0value1value2 也在堆上(即本例中的 0、1、2)?

所以堆上总共有 4 个对象,对吗?

【问题讨论】:

    标签: java arrays heap-memory stack-memory


    【解决方案1】:

    堆栈上不会有对象。在堆栈上,将有一个对存储在堆中的单个int[] 对象的引用值。

    您必须开始区分对象、变量和值。

    局部变量是方法栈帧的一部分,它在栈上。因此,int[] 的引用值将存储在变量中,在堆栈上。

    【讨论】:

    • @SomeRandomGuy 这些不是对象。首先,ArrayInt3 是一个类型。其余的都是价值观。它们是单个 int[] 对象的一部分。他们不是独立的。
    • @SomeRandomGuy 如果它们被初始化,它们将是指向堆上其他 4 个对象的 4 个引用值。
    • @SomeRandomGuy 不,堆上只有一个对象,int[] 对象。
    • 假设 value0、value1 和 value2 已初始化,那么我们在堆上究竟有什么? value0、value1、value2 和 ArrayInt3,对吗?我很抱歉问这个问题。
    • @SomeRandomGuy 您将为ArrayInt3 类型的实例分配内存。该内存将足够大,可以完全容纳这些字段及其值。
    猜你喜欢
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2014-04-21
    • 2019-09-08
    相关资源
    最近更新 更多