【问题标题】:How's the memory allocated for multidimensional array when one of the index is not specified未指定索引之一时如何为多维数组分配内存
【发布时间】:2014-01-05 19:36:02
【问题描述】:

假设我有一个 Java 程序

int[5][] array;
arr[0]= getMeArray(var);
arr[1]= getMeArray(var);
..and so on

public int[] getMeArray(int var){
 if(var == 0)
  return new int[9];
 else
  return new int[5];
}

现在,内存分配是在编译时完成的,因为它应该按照我的理解完成,但我不知道如何弄清楚应该分配多少给数组。

【问题讨论】:

  • 你的意思是在这种特殊情况下还是一般情况下?

标签: java arrays memory


【解决方案1】:

我假设你打算写这样的东西:

int[][] array = new int[5][];  // this compiles

现在,回答您的问题:变量array 只是一个参考;内存被它指向的任何东西所消耗。在这种情况下,它指向int[]s 的数组。具体来说,它指向一个引用数组,每个引用指向一个int[]

+-----+-----+-----+-----+------+ 数组 ----------> | [0] | [1] | [2] | [3] | [4] | +-----+-----+-----+-----+------+ | | | | | | | | | | | | | | | v v v v +-----+ ... ... ... ... | 0 | +-----+ | 0 | ...

水平数组首先分配new int[5][](这会消耗内存)。然后,当您在getMeArray() 中分配每个单独的整数数组时,会进一步消耗内存。这是一个运行时现象。

【讨论】:

    【解决方案2】:

    现在,内存分配是在编译时完成的,因为应该按照我的理解来完成

    不,这就是它在 C 中的工作方式。Java 数组完全不同!

    但我不确定如何计算应该分配给数组的数量。

    您的意思是要为数组分配多少内存?

    多维数组是对数组对象的引用数组。

    对对象的引用占用固定数量的空间,比方说 B 字节。 int 数组每个整数大约需要 4 个字节,加上额外的 4 个字节用于存储其大小(所有 Java 数组都是如此)。因此,对于您的示例,每个子数组的大小将是 5*B + 4 + 每个子数组大小的 4 倍 + 4。子数组仅在您的程序实际创建时才分配。对于所有数组都是如此,它们仅在您的程序创建时才分配。我的计算假设整个事物,包括子数组,已经被创建。

    【讨论】:

      【解决方案3】:

      Java 数组声明只不过是引用。所以int[5][] array 不会编译。您只能声明像int[][] array 这样的二维数组,因此它会显示array 是对二维数组的引用。 数组的大小是在运行时确定的,而不是在编译时确定的。所以可以这样写代码:

      public void main() {
          int[][] test = new int[get()][];
      }
      int get() {
          return (int) (Math.random() * 10);
      }
      

      即使您声明像int[][] array = new int[5][] 这样的大小,array 的大小也不会在运行时之前确定。这也解释了为什么Java中没有像sizeof这样的运算符,没有意义。

      【讨论】:

        【解决方案4】:

        在 Java 中,该程序无法运行。您需要更改此行:

        int[5][] array;
        

        到:

        int[][] array = new int[5][];
        

        所有数组分配都发生在运行时。这将分配一个由int[] 数组组成的数组(实际上是一个引用数组),最初都设置为null。 Java 根本没有多维数组,即单个内存块由多个下标索引。相反,它只有数组数组。

        【讨论】:

          【解决方案5】:

          二维数组是数组的数组。第一个数组包含对其他数组的引用。因此,分配了存储 n 个 refetencies 所需的内存。

          第二维数组的内存稍后分配,当调用方法getmeArrray时。

          【讨论】:

            猜你喜欢
            • 2021-11-15
            • 2021-07-21
            • 2015-11-04
            • 2012-11-30
            • 1970-01-01
            • 2015-02-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多