关于内存:Java:二维数组以列主要或行主要顺序存储?

Java: A two dimensional array is stored in column-major or row-major order?

在爪哇中,多维数组是以列主或行主顺序存储的吗?


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

1
int[][]

…是一个int[]数组(当然,int[]是一个int数组)。

因此,Java既不是列主要也不是行主要顺序(但请参阅下面关于如何读取EDCOX1〔3〕),因为当给定数组的条目被存储在连续的内存块中时,这些条目指向的从属数组是对完全分离的、无关的内存块的对象引用。这也意味着Java的数组数组本质上是锯齿状的:在EDCOX1×4中的条目可能指的是一个3个时隙数组,EDCOX1的5个数组中的一个可能指的是一个4个时隙数组,EDCOX1×6可能根本不引用一个数组(它可以有EDCOX1×7),也许EDCOX1×8指的是一个6个时隙数组。

一张图片价值1K-24个字,所有这些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
                         +????????+
                   +????>| 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引用的条目。"我认为这与行主顺序相当相似,但这并不完全相同。


在爪哇中,只有一维数组。

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

1
2
3
4
5
6
7
8
9
int[ ][ ] table;

table = new int[3][ ];

table[0] = new int[5];

table[1] = new int[5];

table[2] = new int[5];


两者都不。Java中的二维数组是数组引用的数组。它不是线性存储在内存中的。