在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":
一个多维数组的克隆是浅的,也就是说它只创建一个新的数组。子数组是共享的