当前位置: 首页 > 面试题库 >

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

相洛华
2023-03-14
问题内容

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

int a[];

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


问题答案:

正如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(可能是实验的JVM)可以告诉对象何时永不“退出”方法,并可以在堆栈上分配整个对象。但是,如果你选择关心的话,它在概念上是堆的。



 类似资料:
  • 问题内容: 我只知道非基元(对象)放在堆上,方法在堆栈上,但是基元变量呢? -更新 根据答案,我可以说堆可以有一个新的堆,并且给定对象可以堆吗?假设对象将具有基本变量和引用变量。 问题答案: 本地定义的基元将在堆栈中。但是,如果将原语定义为对象实例的一部分,则该原语将位于堆上。 关于更新: 对象没有自己的堆栈。在我的示例中,实际上是的每个实例的一部分。只要分配了HeapClass的实例(例如),就

  • 我保证这个问题以前被问过,但是我没有能够通过搜索找到它;对于任何冗余,请提前道歉。 我的理解(可能是错误的)是,只有在编译时知道对象的大小时,才能分配给堆栈。因此,在初始化数组的情况下,可以执行以下操作之一(这应该放在堆栈上): 由于这个数组的大小在编译时是已知的,所以这应该没有问题。 另一方面,这(我相信)也是有效的代码: 这也会被放在堆栈上吗?我很确定如果你释放()这个,代码会出错,所以我认为

  • 问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。

  • 问题内容: 假设我有两个陈述。 哪个是堆栈内存,哪个存储在堆中? 两者之间有什么区别? 创建了多少个对象,内存中的引用如何? 最佳做法是什么? 问题答案: 所有对象都存储在堆中(包括其字段的值)。1个 局部变量(包括参数)始终包含原始值或引用,并存储在堆栈中。1个 因此,对于您的两行: 您将在堆上有两个对象(两个包含的String对象)和两个引用(每个对象一个)在堆栈上(提供且是局部变量)。 (实

  • 主要内容:src/runoob/heap/MaxHeap.java 文件代码:一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值。 堆总是一棵完全二叉树。 二、适用说明 堆是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在 O(1)~O(logn) 之间,堆通常用于动态分配和释放程序所使用的对象。 若

  • 问题内容: 标识符或变量名在Java中存储在哪里?我知道对象会存储在堆中,变量会存储在堆或栈中,具体取决于变量的类型和范围。我们可以调试或编写任何程序来确认它吗? 感谢和问候 问题答案: 字段 名称作为类元数据的一部分存储在以前的PermGen now-Metaspace中。 数组元素 没有名称,只有数字。(提示Patrick McGoohan。) 如果选择了该选项,则 方法和构造函数参数的 名称