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]意思是"获取索引2处a的条目引用的3数组,然后获取该下级数组的索引所引用的条目." 我认为它与行主要订单非常相似,但它并不完全相同.
两者都不。我们有时可能认为Java中的二维数组实际上是对数组的引用的数组。它不是线性存储在内存中的。
Java 语言规范在简介中指出了这一点:
该语言支持数组的数组,而不是多维数组。
这有几个含义。
数组类型的单个变量可能包含对不同长度数组的引用,因为数组的长度不是其类型的一部分。
多维数组的克隆是浅的,也就是说它仅创建一个新数组。子数组是共享的。
在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)