1

我在 Java 中定义了一个二维数组。当我读到它(即二维数组)时,这个二维数组的第一个维度是一个指针(我不知道这对与否,请告诉我)。因此,如果我将其视为指针,在 64 位系统中,执行后以下代码的大小是多少?

    short [][] array1 = new short [10][];
    short[][] array2 = new short[10][];
    for (int i = 0; i < 10; i++)
        array1[i] = new short[1];
    for (int i = 0; i < 10; i++)            
            array2[i] = array1[i];         

请告诉我上述代码的大小。

4

1 回答 1

2

对于每个一维数组,除了数组中的数据空间外,还有 24 字节的开销。

  • 所以你的前两行代码每行都创建一个包含 10 个指针的数组——你是对的——在 64 位系统上每个指针占用 8 个字节。这意味着您正在分配 2 * (24 + 10 * 8) = 208 个字节。
  • 在第一个for循环中,您将创建 10 个数组,每个数组 24 + 2 * 10 = 44 个字节。这些被填充到至少 8 个字节边界,因此总共占用 48 个字节或 480 个字节。
  • 在第二个循环中,您没有分配任何新内存。
  • 您总共使用了 208 + 480 = 688 个字节。

请注意,实际使用情况取决于 JVM。例如:

  • 一些 JVM压缩指针
  • 一些 JVM 只对数组使用 12 字节的标头。

为了查看外部数组和内部数组之间的区别,像这样重写代码可能会有所帮助:

short[][] outerArray = new short[10][]; // Array of references to short arrays
short[] innerArray;                     // Array of shorts
for (int i = 0; i < 10; i++) {
  innerArray = new short[1];
  outerArray[i] = innerArray;
}
于 2013-11-11T19:01:58.003 回答