Java:二维数组以列为主或行为主的顺序存储



在Java中,多维数组是以列为主还是行为主的顺序存储的?

Java没有多维数组。它有数组的数组。例如,

int[][]

…是int[]的数组(当然int[]int的数组)。

因此,Java既不是以列为主顺序,也不是以行为主顺序(但请参阅下面关于如何读取a[2][3]的注意事项),因为当给定数组的项存储在连续的内存块中时,这些项指向的下级数组是对完全独立的、不相关的内存块的对象引用。这也意味着Java的数组数组本质上是参差的: [0]的条目可能指向一个3槽的数组,[1]的条目可能指向一个4槽的数组,[2]可能根本不指向一个数组(它可能有null),也许[3]指向一个6槽的数组。

一张图片抵得上1k-24个字;

<>之前+−−−−−−−−++−−−>| int[] |+−−−−−−−−−−−−−+ || int[][] | | | 0: int |+−−−−−−−−−−−−+ | | 1:int || 0: int[] |−−−−−−−−+ | 2:int || 1: int[] |−−−−−−+ +−−−−−−−−+| 2: null || 3: int[] |−−+ | +−−−−−−−−−++−−−−−−−−−−−−−+ | +−−−>| int[] || + −−−−−−−−+| | 0: int || | 1: int| | 2: int| | 3: int || + −−−−−−−−+|| + −−−−−−−−++−−−−−−−−−−| int[] |+−−−−−−−−+| 0: int || 1: int || 2: int| 3: int || 4: int || 5: int |+−−−−−−−−+之前

一旦你知道了这一点,你就知道(假设)a[2][3]意味着"获取由a的索引2的条目引用的数组,然后获取由该从属数组的索引3引用的条目。"我认为它与行主序非常相似,但又不完全相同

在Java中,您只有一维数组。

二维数组基本上就是一维数组的一维数组。

int[ ][ ] table;
table = new int[3][ ];
table[0] = new int[5];
table[1] = new int[5];
table[2] = new int[5];

都不是。在Java中,我们有时认为的二维数组实际上是对数组的引用的数组。它不是线性地存储在内存中。

Java语言规范在介绍中说明了这一点:

语言支持数组的数组,而不是多维数组。

这有几个含义。

  • 数组的数组可以交错——成员数组可以有不同的长度。
  • 外部数组的成员是引用,可以为空。
  • 克隆外部数组是浅的——成员数组在原始和克隆之间共享。

摘自JLS,第10.2节,"数组变量":

数组类型的单个变量可以包含对不同长度数组的引用,因为数组的长度不是其类型的一部分。

取自JLS第10.7节,"Array Members":

一个多维数组的克隆是浅的,也就是说它只创建一个新的数组。子数组是共享的

相关内容

  • 没有找到相关文章

最新更新