二维数组

71 阅读1分钟

二维数组

 int[][] array = {
     {11, 12, 13, 14, 15},
     {21, 22, 23, 24, 25},
     {31, 32, 33, 34, 35},
 };
  • 二维数组占 32 个字节,其中 array[0],array[1],array[2] 三个元素分别保存了指向三个一维数组的引用
  • 三个一维数组各占 40 个字节
  • 它们在内层布局上是连续

更一般的,对一个二维数组 Array[m][n]

  • m 是外层数组的长度,可以看作 row 行

  • n 是内层数组的长度,可以看作 column 列

  • 当访问 Array[i][j],0\leq i \lt m, 0\leq j \lt n时,就相当于

    • 先找到第 i 个内层数组(行)
    • 再找到此内层数组中第 j 个元素(列)

Java 环境下(不考虑类指针和引用压缩,此为默认情况),有下面的二维数组

 byte[][] array = {
     {11, 12, 13, 14, 15},
     {21, 22, 23, 24, 25},
     {31, 32, 33, 34, 35},
 };

已知 array 对象起始地址是 0x1000,那么 23 这个元素的地址是什么?

  • 起始地址 0x1000
  • 外层数组大小:16字节对象头 + 3元素 * 每个引用4字节 + 4 对齐字节 = 32 = 0x20
  • 第一个内层数组大小:16字节对象头 + 5元素 * 每个byte1字节 + 3 对齐字节 = 24 = 0x18
  • 第二个内层数组,16字节对象头 = 0x10,待查找元素索引为 2
  • 最后结果 = 0x1000 + 0x20 + 0x18 + 0x10 + 2*1 = 0x104a