Java 基元数组是存储在栈中还是堆中?

新手上路,请多包涵

我有一个这样的数组声明:

 int a[];

这里 a 是原始数组 int 类型。这个数组存储在哪里?它存储在堆上还是堆栈上?这是一个原始类型 int ,所有原始类型都不存储在堆上。

原文由 user241924 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 433
1 个回答

正如 gurukulki 所说,它存储在堆上。但是,您的帖子暗示了一种误解,可能是由于某些善意的人传播了“基元总是存在于堆栈中”的神话。这是不真实的。 局部变量 在堆栈上有它们的值,但并非所有原始变量都是局部的……

例如,考虑一下:

 public class Foo
{
    int value;
}
...

public void someOtherMethod()
{
    Foo f = new Foo();
    ...
}

现在, f.value 住在哪里?神话暗示它在堆栈上——但实际上它是新的 Foo 对象的一部分,并且存在于堆1上。 (注意 f 的值本身是一个引用,并且存在于堆栈中。)

从那里开始,这是一个简单的数组步骤。您可以将数组视为很多变量 - 所以 new int[3] 有点像具有这种形式的类:

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


1事实上,它比这更复杂。堆栈/堆的区别主要是一个实现细节——我相信一些 JVM,可能是实验性的,可以判断一个对象何时永远不会从方法中“逃脱”,并且可以在堆栈上分配整个对象。但是,如果您选择关心的话,它在 概念 上是堆上的。

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题