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

Zou*_*ias 40 java memory performance multidimensional-array

在Java中,是一个以列主要或行主要顺序存储的多维数组?

T.J*_*der 75

Java没有多维数组.它有数组数组.所以,例如,

int[][]
Run Code Online (Sandbox Code Playgroud)

...是一个数组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]意思是"获取索引2a的条目引用的3数组,然后获取该下级数组的索引所引用的条目." 我认为它与行主要订单非常相似,但它并不完全相同.

  • 比我的答案更完整.+1.Java在内存存储方面没有多维数组 - 但JLS本身将Java的数组数组松散地称为"多维数组". (4认同)
  • 谢谢你的回答,TJ克劳德.所以,我想在行主要排序中扫描一维数组的数组效率更高. (2认同)

And*_*mas 5

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

Java 语言规范在简介中指出了这一点:

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

这有几个含义。

  • 数组的数组可以是锯齿状的——成员数组可以有不同的长度。
  • 外部数组的成员是引用,并且可以为 null。
  • 克隆外部数组是浅表的——成员数组在原始数组和克隆数组之间共享。

来自JLS,第 10.2 节,“数组变量”

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

来自JLS,第 10.7 节“数组成员”

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

  • 这是相似的,因为特定行中的列是连续存储的。但是,行本身并不是连续存储的。C 中的二维数组是一块内存。了解数据是按行优先顺序还是按列优先顺序放置在该块中可能很重要。但在一维数组中,只有一种布局。 (4认同)

Kal*_*Kal 5

在Java中,只有一维数组。

2D数组基本上只是一维数组的一维数组。

int[ ][ ] table;

table = new int[3][ ];

table[0] = new int[5];

table[1] = new int[5];

table[2] = new int[5];
Run Code Online (Sandbox Code Playgroud)